loading

【算法打卡】滑动窗口

日常打卡只写思路,这里集合题解

# 多数元素 5.31

多数元素 (opens new window)

# 解法一:排序

// 题意只需要找出一个即可
// 给定的数组总是存在多数元素。排序后的数组,中位数就一定是多数元素。
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

# 解法二:栈方法

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

# 无重复字符的最长子串 5.25

无重复字符的最长子串 (opens new window)

# 解法一 滑动窗口

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

# 解法二 利用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

# 大数相加 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
最近更新时间: 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