【算法打卡】滑动窗口
日常打卡只写思路,这里集合题解
# 多数元素 5.31
# 解法一:排序
// 题意只需要找出一个即可
// 给定的数组总是存在多数元素。排序后的数组,中位数就一定是多数元素。
var majorityElement = function (nums) {
nums.sort((a, b) => a - b)
return nums[Math.floor(nums.length / 2)]
};
console.log(majorityElement([2, 2, 1, 1, 1, 2, 2]));
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 解法二:栈方法
var majorityElement = function(nums) {
let stack = []
for(let n of nums){
let m = stack.length
if(stack[m - 1] === n || !m){
stack.push(n)
} else {
stack.pop()
}
}
return stack[0]
};
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 无重复字符的最长子串 5.25
# 解法一 滑动窗口
var lengthOfLongestSubstring = function(s) {
// 定义左右指针
let start = 0;
let res = 0;
// map方便查找
const map = new Map()
// 不断移动右指针
for(let i = 0; i < s.length; i++) {
// 遇到重复字符,就把左指针移动到重复字符的下一位
if(map.has(s[i]) && map.get(s[i]) >= start) {
start = map.get(s[i]) + 1
}
// 记录所有窗口的长度,并返回最大值
res = Math.max(res, i - start + 1)
// 填充map, key:字符串,value:字符串的下标 。 为下一次循环查找做准备
map.set(s[i], i)
}
return res
};
console.log(lengthOfLongestSubstring('pwwkew')); // 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 解法二 利用Set数据结构判断重复字符
leetcode官方解答
var lengthOfLongestSubstring = function(s) {
// 哈希集合,记录每个字符是否出现过
const occ = new Set();
const n = s.length;
// 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
let rk = -1, ans = 0;
for (let i = 0; i < n; ++i) {
if (i != 0) {
// 左指针向右移动一格,移除一个字符
occ.delete(s.charAt(i - 1));
}
while (rk + 1 < n && !occ.has(s.charAt(rk + 1))) {
// 不断地移动右指针
occ.add(s.charAt(rk + 1));
++rk;
}
// 第 i 到 rk 个字符是一个极长的无重复字符子串
ans = Math.max(ans, rk - i + 1);
}
return ans;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 大数相加 5.7
- 小数位?
- 乘法、除法、减法?
const num1 = "9007199254740991";
const num2 = "1234567899999999999";
const addNum = (num1: string, num2: string): string => {
const maxLength = Math.max(num1.length, num2.length);
//用0去补齐长度 为了进位
num1 = num1.padStart(maxLength, "0");
num2 = num2.padStart(maxLength, "0");
//定义加法过程中需要用到的变量
let t = 0;
let f = 0; // 进位
let sum = "";
for (let i = maxLength - 1; i >= 0; i--) {
t = parseInt(num1[i]) + parseInt(num2[i]) + f;
f = Math.floor(t / 10);
sum = (t % 10) + sum;
}
if (f === 1) {
sum = "1" + sum;
}
return sum;
};
console.log(addNum(num1,num2),'addNum');
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
最近更新时间: 2021/06/02 20:18:58
- 01
- 2023/02/08 00:00:00
- 02
- 2023/01/03 00:00:00
- 03
- 2022/12/21 00:00:00