Skip to content

Commit 8d2c896

Browse files
committed
✨ next premutation
1 parent 8b38f40 commit 8d2c896

File tree

4 files changed

+86
-38
lines changed

4 files changed

+86
-38
lines changed

src/2-add-two-numbers/index.js

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,31 @@
1-
// HELP:
2-
import { ListNode } from '../_utils';
3-
4-
export const addTwoNumbers = (l1, l2) => {
5-
const dummyHead = new ListNode(0);
6-
let curr = dummyHead;
1+
/**
2+
* Definition for singly-linked list.
3+
* function ListNode(val) {
4+
* this.val = val;
5+
* this.next = null;
6+
* }
7+
*/
8+
/**
9+
* @param {ListNode} l1
10+
* @param {ListNode} l2
11+
* @return {ListNode}
12+
*/
13+
var addTwoNumbers = function (l1, l2) {
14+
const node = new ListNode();
15+
let cur = node;
716
let carry = 0;
817

918
while (l1 || l2) {
10-
let x = l1 ? l1.val : 0;
11-
let y = l2 ? l2.val : 0;
12-
let sum = carry + x + y;
13-
if (l1) l1 = l1.next;
14-
if (l2) l2 = l2.next;
19+
const sum = (l1 ? l1.val : 0) + (l2 ? l2.val : 0) + carry;
20+
carry = sum >= 10 ? 1 : 0;
21+
cur.next = new ListNode(sum % 10);
22+
cur = cur.next;
1523

16-
carry = ~~(sum / 10);
17-
curr.next = new ListNode(sum % 10);
18-
curr = curr.next;
24+
l1 && (l1 = l1.next);
25+
l2 && (l2 = l2.next);
1926
}
2027

21-
if (carry > 0) curr.next = new ListNode(carry);
28+
carry && (cur.next = new ListNode(carry));
2229

23-
return dummyHead.next;
30+
return node.next;
2431
};
Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
1-
// TODO:
2-
export function lengthOfLongestSubstring(str) {
3-
const strLength = str.length;
4-
let maxLength = 0;
1+
/**
2+
* @param {string} s
3+
* @return {number}
4+
*/
5+
var lengthOfLongestSubstring = function (s) {
6+
const len = s.length;
57
const map = new Map();
6-
let i = 0;
7-
for (let j = 0; j < strLength; j++) {
8-
if (map.has(str.charAt(j))) {
9-
i = Math.max(map.get(str.charAt(j)), i);
8+
let start = 0;
9+
let res = 0;
10+
11+
for (let end = 0; end < len; end++) {
12+
if (map.has(s[end])) {
13+
start = Math.max(map.get(s[end]), start);
1014
}
11-
maxLength = Math.max(maxLength, j - i + 1);
12-
map.set(str.charAt(j), j + 1);
15+
res = Math.max(res, end - start + 1);
16+
map.set(s[end], end + 1);
1317
}
1418

15-
return maxLength;
16-
}
19+
return res;
20+
};

src/31-next-premutation/index.js

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
const assert = require('assert').strict;
2+
3+
function nextPermutation(nums) {
4+
let i = nums.length - 2; // 向左遍历,i从倒数第二开始是为了nums[i+1]要存在
5+
6+
// 寻找第一个小于右邻居的数
7+
while (i >= 0 && nums[i] >= nums[i + 1]) {
8+
i--;
9+
}
10+
11+
// 这个数在数组中存在,从它身后挑一个数,和它换
12+
if (i >= 0) {
13+
let j = nums.length - 1; // 从最后一项,向左遍历
14+
15+
// 寻找第一个大于 nums[i] 的数
16+
while (j >= 0 && nums[j] <= nums[i]) {
17+
j--;
18+
}
19+
20+
[nums[i], nums[j]] = [nums[j], nums[i]]; // 两数交换,实现变大
21+
}
22+
23+
// 如果 i = -1,说明是递减排列,如 3 2 1,没有下一排列,直接翻转为最小排列:1 2 3
24+
let l = i + 1;
25+
let r = nums.length - 1;
26+
while (l < r) {
27+
// i 右边的数进行翻转,使得变大的幅度小一些
28+
[nums[l], nums[r]] = [nums[r], nums[l]];
29+
l++;
30+
r--;
31+
}
32+
33+
return nums;
34+
}
35+
36+
assert.deepEqual(nextPermutation([1, 2, 3]), [1, 3, 2]);
37+
assert.deepEqual(nextPermutation([3, 2, 1]), [1, 2, 3]);
38+
assert.deepEqual(nextPermutation([1, 1, 5]), [1, 5, 1]);

src/5-longest-palindromic-substring/index.js

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,21 @@
33
* @return {string}
44
*/
55

6-
// 字节跳动
7-
// HELP:
8-
9-
var longestPalindrome = function(s) {
6+
var longestPalindrome = function (s) {
107
let n = s.length;
11-
let res = "";
12-
let dp = Array.from(new Array(n), () => new Array(n).fill(0));
8+
let dp = Array.from({ length: n }, () => Array(n).fill(false));
9+
let start = 0;
10+
let end = 0;
1311

1412
for (let i = n - 1; i >= 0; i--) {
1513
for (let j = i; j < n; j++) {
16-
dp[i][j] = s[i] == s[j] && (j - i < 2 || dp[i + 1][j - 1]);
17-
if (dp[i][j] && j - i + 1 > res.length) {
18-
res = s.slice(i, j + 1);
14+
dp[i][j] = s[i] === s[j] && (j - i < 2 || dp[i + 1][j - 1]);
15+
if (dp[i][j] && j - i > end - start) {
16+
start = i;
17+
end = j;
1918
}
2019
}
2120
}
2221

23-
return res;
22+
return s.slice(start, end + 1);
2423
};

0 commit comments

Comments
 (0)