Skip to content

Commit a429dc9

Browse files
committed
feat: update 4 leetcode
1 parent a494dfc commit a429dc9

File tree

4 files changed

+241
-0
lines changed

4 files changed

+241
-0
lines changed
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
* @lc app=leetcode id=167 lang=javascript
3+
*
4+
* [167] Two Sum II - Input array is sorted
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* 最初考虑使用冒泡,但是时间复杂度太高
10+
* 后续使用双指针解决
11+
* 也可以使用二分法
12+
* 下面是二分法的解决,时间复杂度 O(nlogn)
13+
* @param {number[]} numbers
14+
* @param {number} target
15+
* @return {number[]}
16+
*/
17+
var twoSum = function(numbers, target) {
18+
for (let i = 0; i < numbers.length; i++) {
19+
let low = i + 1;
20+
let high = numbers.length - 1;
21+
22+
while (low <= high) {
23+
// 这里记得取得整数
24+
let mid = ~~((high - low) / 2 + low);
25+
if (numbers[i] + numbers[mid] === target) {
26+
return [i + 1, mid + 1];
27+
} else if (numbers[i] + numbers[mid] > target) {
28+
high = mid - 1;
29+
} else {
30+
low = mid + 1;
31+
}
32+
}
33+
}
34+
return [1, numbers.length];
35+
};
36+
37+
/**
38+
* 双指针的写法
39+
* 时间复杂度 O(n)
40+
* @param {*} numbers
41+
* @param {*} target
42+
* @returns
43+
*/
44+
var twoSum2 = function(numbers, target) {
45+
let i = 0;
46+
let j = numbers.length - 1;
47+
48+
// 因为是一定有解,所以可以这样设置条件
49+
while (numbers[i] + numbers[j] !== target) {
50+
// 如果总和超过则右指针左移,如果总和少于则左指针右移
51+
if (numbers[i] + numbers[j] > target) {
52+
j--;
53+
} else {
54+
i++;
55+
}
56+
}
57+
58+
return [i + 1, j + 1];
59+
};
60+
// @lc code=end

leetcode/2.add-two-numbers.js

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/*
2+
* @lc app=leetcode id=2 lang=javascript
3+
*
4+
* [2] Add Two Numbers
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* Definition for singly-linked list.
10+
* function ListNode(val, next) {
11+
* this.val = (val===undefined ? 0 : val)
12+
* this.next = (next===undefined ? null : next)
13+
* }
14+
*/
15+
/**
16+
* @param {ListNode} l1
17+
* @param {ListNode} l2
18+
* @return {ListNode}
19+
*/
20+
var addTwoNumbers = function(l1, l2) {
21+
let ans = new ListNode(-1);
22+
let cur = ans;
23+
let carry = 0;
24+
25+
while (l1 || l2) {
26+
const val1 = l1 && l1.val || 0; // 注意保留默认值
27+
const val2 = l2 && l2.val || 0; // 注意保留默认值
28+
const sum = val1 + val2 + carry;
29+
cur.next = new ListNode(sum % 10);
30+
cur = cur.next;
31+
// 当前和触发了进位,或者之前的进位仍然向前进
32+
// carry = val1 + val2 > 9 || (val1 + val2 === 9 && carry);
33+
// 下面这个方式的判断更加简洁
34+
carry = Math.floor(sum / 10);
35+
36+
l1 = l1 ? l1.next : l1;
37+
l2 = l2 ? l2.next : l2;
38+
}
39+
40+
// 如果全部加完还有进位的话
41+
if (carry) {
42+
cur.next = new ListNode(1);
43+
}
44+
45+
return ans.next;
46+
};
47+
48+
/**
49+
* 将链表值转化成字符串,再转成数字相加,但问题是过大的数字会转成科学记数法
50+
* 因为这个问题 所以需要使用 BigInt
51+
* @param {ListNode} l1
52+
* @param {ListNode} l2
53+
* @return {ListNode}
54+
*/
55+
var addTwoNumbers2 = function(l1, l2) {
56+
let l1Copy = l1;
57+
let l2Copy = l2;
58+
let str1 = str2 = '';
59+
60+
// 保存正确顺序的字符串
61+
while (l1Copy) {
62+
str1 = l1Copy.val + str1;
63+
l1Copy = l1Copy.next;
64+
}
65+
66+
while (l2Copy) {
67+
str2 = l2Copy.val + str2;
68+
l2Copy = l2Copy.next;
69+
}
70+
71+
// 这里注意使用 BigInt 来避免生成科学计数法
72+
// BigInt 接受字符串作为参数
73+
let str = (BigInt(str1) + BigInt(str2)).toString();
74+
let res = str.split('').reverse();
75+
let i = 0;
76+
let ans = new ListNode(-1);
77+
let pre = ans;
78+
79+
// 当链表过长也就是产生的值过大时,这个方案会出错
80+
while (i < res.length) {
81+
pre.next = new ListNode(+res[i]);
82+
pre = pre.next;
83+
i++;
84+
}
85+
86+
return ans.next;
87+
};
88+
89+
// @lc code=end
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* @lc app=leetcode id=3 lang=javascript
3+
*
4+
* [3] Longest Substring Without Repeating Characters
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* 动态规划?
10+
* 滑动窗口,每往右一格,重新判断一次
11+
* 逻辑类似判断子数组
12+
* @param {string} s
13+
* @return {number}
14+
*/
15+
var lengthOfLongestSubstring = function(s) {
16+
if (!s) {
17+
return 0;
18+
}
19+
// 保存当前最长的字符串
20+
let str = '';
21+
let maxLength = Number.MIN_SAFE_INTEGER;
22+
23+
for (const cur of s) {
24+
const index = str.indexOf(cur);
25+
// 动态改变当前最长的字符串
26+
if (index !== -1) {
27+
str = str.slice(index + 1);
28+
}
29+
str += cur;
30+
// 保存更大长度值
31+
maxLength = Math.max(maxLength, str.length);
32+
}
33+
34+
return maxLength;
35+
};
36+
// @lc code=end

leetcode/61.rotate-list.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* @lc app=leetcode id=61 lang=javascript
3+
*
4+
* [61] Rotate List
5+
*/
6+
7+
// @lc code=start
8+
/**
9+
* Definition for singly-linked list.
10+
* function ListNode(val, next) {
11+
* this.val = (val===undefined ? 0 : val)
12+
* this.next = (next===undefined ? null : next)
13+
* }
14+
*/
15+
/**
16+
* 时间复杂度:O(n), 最坏情况下,我们需要遍历该链表两次。
17+
* 空间复杂度:O(1),我们只需要常数的空间存储若干变量。
18+
* @param {ListNode} head
19+
* @param {number} k
20+
* @return {ListNode}
21+
*/
22+
var rotateRight = function(head, k) {
23+
if (k === 0 || head === null || head.next === null) {
24+
return head;
25+
}
26+
// 用于保存链表的长度 从 1 开始
27+
let n = 1;
28+
let cur = head;
29+
30+
// 计算长度同时链表到最后一位
31+
while (cur.next) {
32+
cur = cur.next;
33+
n++;
34+
}
35+
36+
let left = n - k % n;
37+
// 假如要移动的数字正好是链表长度的倍数,则无需移动
38+
if (left === n) {
39+
return head;
40+
}
41+
42+
// 将链表形成环
43+
cur.next = head;
44+
45+
while (left) {
46+
cur = cur.next;
47+
left--;
48+
}
49+
50+
const ans = cur.next;
51+
// 断开环
52+
cur.next = null;
53+
54+
return ans;
55+
};
56+
// @lc code=end

0 commit comments

Comments
 (0)