力扣 (LeetCode)-合并兩個(gè)有序鏈表,刪除排序數(shù)組中的重復(fù)項(xiàng),JavaScript筆記
Github來(lái)源:力扣 (LeetCode)|刷題打卡 | 求星星 ? | 給個(gè)??關(guān)注,??點(diǎn)贊,??鼓勵(lì)一下作者
[已開(kāi)啟]任務(wù)一:刷題打卡 * 10 篇
大家好,我是魔王哪吒,很高興認(rèn)識(shí)你~~
哪吒人生信條:如果你所學(xué)的東西 處于喜歡 才會(huì)有強(qiáng)大的動(dòng)力支撐。
每天學(xué)習(xí)編程,讓你離夢(mèng)想更新一步,感謝不負(fù)每一份熱愛(ài)編程的程序員,不論知識(shí)點(diǎn)多么奇葩,和我一起,讓那一顆四處流蕩的心定下來(lái),一直走下去,加油,2021加油!歡迎關(guān)注加我vx:xiaoda0423,歡迎點(diǎn)贊、收藏和評(píng)論
時(shí)間:3 月 1 日 ~ 3 月 13 日
力扣 (LeetCode)-兩數(shù)之和,有效的括號(hào),兩數(shù)相加|刷題打卡-3月1日
前言
如果這篇文章有幫助到你,給個(gè)??關(guān)注,??點(diǎn)贊,??鼓勵(lì)一下作者,接收好挑戰(zhàn)了嗎?文章公眾號(hào)首發(fā),關(guān)注 程序員哆啦A夢(mèng) 第一時(shí)間獲取最新的文章
??筆芯??~
21. 合并兩個(gè)有序鏈表
一、題目描述
將兩個(gè)升序鏈表合并為一個(gè)新的 升序 鏈表并返回。新鏈表是通過(guò)拼接給定的兩個(gè)鏈表的所有節(jié)點(diǎn)組成的。
示例 1:
輸入:l1 = [1,2,4], l2 = [1,3,4]
輸出:[1,1,2,3,4,4]
輸入:l1 = [], l2 = []
輸出:[]
輸入:l1 = [], l2 = [0]
輸出:[0]
二、思路分析
使用遞歸來(lái)解,將兩個(gè)鏈表頭部較小的一個(gè)與剩下的元素合并,并返回排好序的鏈表頭,當(dāng)兩條鏈表中的一條為空時(shí)終止遞歸。 逐一比較最小
三、答案代碼
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
var mergeTwoLists = function(l1, l2) {
// 創(chuàng)建一個(gè)空的鏈表
let curr = new ListNode();
// 創(chuàng)建一個(gè)頭
let dummy = curr;
while(l1!== null && l2 !==null){
// 判斷那個(gè)鏈表的值小,把小的連接起來(lái)
if(l1.val<l2.val){
curr.next = l1;
l1 = l1.next;
}else{
curr.next = l2;
l2= l2.next
}
curr = curr.next;
}
if(l1!==null){
curr.next = l1;
}
if(l2!==null){
curr.next = l2;
}
return dummy.next;
};
*/
/**
* @param {ListNode} l1
* @param {ListNode} l2
* @return {ListNode}
*/
const mergeTwoLists = function (l1, l2) {
if (l1 === null) {
return l2;
}
if (l2 === null) {
return l1;
}
if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
};
知識(shí)補(bǔ)充
JavaScript筆記
變量
JavaScript的類(lèi)型有數(shù)字,字符串,布爾值,函數(shù)和對(duì)象,還有undefined和null,數(shù)組,日期,正則表達(dá)式。
在
JavaScript中,使用關(guān)鍵字var,而不必指定變量類(lèi)型,所以,JavaScript不是強(qiáng)類(lèi)型語(yǔ)言。
typeof操作符返回變量或表達(dá)式的類(lèi)型
console.log(typeof num); // number
console.log(typeof 'jeskson'); // string
console.log(typeof true); // boolean
console.log(typeof [1,2,3]); // object
console.log(typeof {name:'jeskson'}); // object
JavaScript支持delete操作符,可以刪除對(duì)象里的屬性
var my = {name: 'jeskson', age: 1};
delete my.age;
console.log(my); // {name: 'jeskson'}
真假
nudefined // false
null // false
布爾值 // true為true,false為false
數(shù)字 // +0,-0和NaN都為false,其他為true
字符串 // 如果字符串是空的就是false,其他為true
對(duì)象 // true
JavaScript面向?qū)ο缶幊?/section>
a. var obj = new Object();b. var obj = {}
obj = {
name: 'jeskson'
age: 1
};
面向?qū)ο缶幊?strong>OOP,對(duì)象是類(lèi)的實(shí)例,一個(gè)類(lèi)定義了對(duì)象的特征
在原型的中,函數(shù)只會(huì)創(chuàng)建一次,在所有實(shí)例中共享,如果在類(lèi)的定義里聲明,會(huì)在每個(gè)實(shí)例都會(huì)創(chuàng)建自己的函數(shù)副本,使用原型方法可以節(jié)約內(nèi)存和降低實(shí)例化的開(kāi)銷(xiāo)。原型方法只能聲明公共函數(shù)和屬性,而類(lèi)定義可以聲明只在類(lèi)的內(nèi)部訪問(wèn)的私有函數(shù)和屬性。
ECMAScript是一種腳本語(yǔ)言規(guī)范,JavaScript是這個(gè)規(guī)范的一個(gè)實(shí)現(xiàn)。
ECMAScript6的功能
let和const模板字面量 解構(gòu) 展開(kāi)操作符 箭頭函數(shù) =>類(lèi)
ES6引入了一個(gè)let關(guān)鍵字,可以直接把var關(guān)鍵字都替換成let,ES6還引入了const關(guān)鍵字,區(qū)別于const`定義的變量是只讀的,也就是常量。
模板字面量:模板字面量用一對(duì) ` 包裹。要插入變量的值,只要把變量放在${}里就可以了,模板字面量也可以用于多行的字符串
箭頭函數(shù):
let circleArea = (r) => 3.14 * r * r;
函數(shù)的參數(shù)默認(rèn)值:
function sum (x = 1, y = 2, z = 3) {
return x + y + z
};
console.log(sum(4,2)); //輸出9
聲明展開(kāi)和剩余參數(shù):
在 ES5中,我們可以用apply()函數(shù)把數(shù)組轉(zhuǎn)化為參數(shù)ES6有了展開(kāi)操作符(...)在函數(shù)中,展開(kāi)操作符( ...)也可以代替arguments,當(dāng)作剩余參數(shù)使用
console.log(sum(...params));
console.log(sum.apply(undefined, params));
function da(x, y, ...a) {
return (x + y) * a.length;
}
function da(x, y) {
var a = Array.prototype.slice.call(arguments, 2);
return (x + y) * a.length;
}
數(shù)組解構(gòu):
可以用來(lái)一次初始化多個(gè)變量 可以用來(lái)進(jìn)行值的互換,而不需要?jiǎng)?chuàng)建臨時(shí)變量
對(duì)象解構(gòu):
var [x, y] = ['a', 'b'];
var obj = { x, y };
console.log(obj); // { x: "a", y: "b" }
方法屬性:
var hello = {
name : 'dada魔王哪吒',
printHello() {
console.log('Hello');
}
}
var hello = {
name: 'dada魔王哪吒',
printHello: function printHello() {
console.log('Hello');
}
};
使用類(lèi)進(jìn)行面向?qū)ο缶幊?
function dada(name, age) {
this.name = name;
this.age = age;
}
dada.prototype.printWork = function() {
console.log(this.name);
};
class dada {
// 聲明一個(gè)有constructor函數(shù)
constructor(name, age) {
this.name = name;
this.age = age;
}
printWork() {
console.log(this.name);
}
}
繼承
可以使用extends關(guān)鍵字?jǐn)U展一個(gè)類(lèi)并繼承它的行為,在構(gòu)造函數(shù)中,也可以使用super關(guān)鍵字引用父類(lèi)的構(gòu)造函數(shù)。
JavaScript面向?qū)ο缶幊淌腔谠蛯?shí)現(xiàn)的
class itBook extends Book {
costructor(title, pages, isbn, technology) {
super(title, pages, isbn);
this.technology = technology;
}
printTechnology() {
console.log(this.technology);
}
}
let daBook = new itBook('魔王哪吒算法', '222', '1333', 'JavaScript');
使用屬性存取器
是一個(gè)聲明了get和set函數(shù)的類(lèi):
class Person {
constructor (name) {
this._name = name;
}
get name() {
return this._name;
}
set name(value) {
this._name = value;
}
}
let dada = new Person('jeskson');
ddada.name = '魔王哪吒';
26. 刪除排序數(shù)組中的重復(fù)項(xiàng)
一、題目描述
給定一個(gè)排序數(shù)組,你需要在 原地 刪除重復(fù)出現(xiàn)的元素,使得每個(gè)元素只出現(xiàn)一次,返回移除后數(shù)組的新長(zhǎng)度。
不要使用額外的數(shù)組空間,你必須在 原地 修改輸入數(shù)組 并在使用 O(1) 額外空間的條件下完成。
示例 1:
給定數(shù)組 nums = [1,1,2],
函數(shù)應(yīng)該返回新的長(zhǎng)度 2, 并且原數(shù)組 nums 的前兩個(gè)元素被修改為 1, 2。
你不需要考慮數(shù)組中超出新長(zhǎng)度后面的元素。
示例 2:
給定 nums = [0,0,1,1,1,2,2,3,3,4],
函數(shù)應(yīng)該返回新的長(zhǎng)度 5, 并且原數(shù)組 nums 的前五個(gè)元素被修改為 0, 1, 2, 3, 4。
你不需要考慮數(shù)組中超出新長(zhǎng)度后面的元素。
說(shuō)明:
為什么返回?cái)?shù)值是整數(shù),但輸出的答案是數(shù)組呢?
請(qǐng)注意,輸入數(shù)組是以「引用」方式傳遞的,這意味著在函數(shù)里修改輸入數(shù)組對(duì)于調(diào)用者是可見(jiàn)的。
你可以想象內(nèi)部操作如下:
// nums 是以“引用”方式傳遞的。也就是說(shuō),不對(duì)實(shí)參做任何拷貝
int len = removeDuplicates(nums);
// 在函數(shù)里修改輸入數(shù)組對(duì)于調(diào)用者是可見(jiàn)的。
// 根據(jù)你的函數(shù)返回的長(zhǎng)度, 它會(huì)打印出數(shù)組中該長(zhǎng)度范圍內(nèi)的所有元素。
for (int i = 0; i < len; i++) {
print(nums[i]);
}
二、思路分析
使用快慢指針來(lái)記錄遍歷的坐標(biāo),如果兩個(gè)指針指的數(shù)字相同,則快指針向前走一步,如果不同,則兩個(gè)指針都向前走一步,當(dāng)快指針走完整個(gè)數(shù)組后,慢指針當(dāng)前的坐標(biāo)加1,就是數(shù)組中不同數(shù)字的個(gè)數(shù)。
實(shí)際上這就是雙指針中的快慢指針。在這里快指針是讀指針, 慢指針是寫(xiě)指針。









三、答案代碼
/**
* @param {number[]} nums
* @return {number}
*/
var removeDuplicates = function (nums) {
if (size == 0) return 0;
let slowP = 0;
for (let fastP = 0; fastP < nums.length; fastP++) {
if (nums[fastP] !== nums[slowP]) {
slowP++;
nums[slowP] = nums[fastP];
}
}
return slowP + 1;
};
總結(jié):
刪除排序數(shù)組中的重復(fù)項(xiàng),合并兩個(gè)有序鏈表-題解!
回看筆者往期高贊文章,也許能收獲更多喔!
一個(gè)合格的初級(jí)前端工程師需要掌握的模塊筆記 Vue.js筆試題解決業(yè)務(wù)中常見(jiàn)問(wèn)題 【初級(jí)】個(gè)人分享Vue前端開(kāi)發(fā)教程筆記 長(zhǎng)篇總結(jié)之JavaScript,鞏固前端基礎(chǔ) 前端面試必備ES6全方位總結(jié) 達(dá)達(dá)前端個(gè)人web分享92道JavaScript面試題附加回答 【圖文并茂,點(diǎn)贊收藏哦!】重學(xué)鞏固你的Vuejs知識(shí)體系 【思維導(dǎo)圖】前端開(kāi)發(fā)-鞏固你的JavaScript知識(shí)體系 14期-連肝7個(gè)晚上,總結(jié)了計(jì)算機(jī)網(wǎng)絡(luò)的知識(shí)點(diǎn)!(共66條)
??關(guān)注+點(diǎn)贊+收藏+評(píng)論+轉(zhuǎn)發(fā)??,原創(chuàng)不易,鼓勵(lì)筆者創(chuàng)作更好的文章
點(diǎn)贊、收藏和評(píng)論
我是Jeskson(達(dá)達(dá)前端),感謝各位人才的:點(diǎn)贊、收藏和評(píng)論,我們下期見(jiàn)!(如本文內(nèi)容有地方講解有誤,歡迎指出?謝謝,一起學(xué)習(xí)了)
我們下期見(jiàn)!
文章持續(xù)更新,可以微信搜一搜「 程序員哆啦A夢(mèng) 」第一時(shí)間閱讀,回復(fù)【資料】有我準(zhǔn)備的一線(xiàn)大廠資料,本文 http://www.dadaqianduan.cn/#/ 已經(jīng)收錄
github收錄,歡迎Star:https://github.com/webVueBlog/WebFamily
