算法

Posted by Chouvel on November 19, 2024

双指针-80

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
/**
 * @param {number[]} nums
 * @return {number}
 */
var removeDuplicates = function (nums) {
  // for (var i = 0; i < nums.length-2; i++) {
  //         if (nums[i] === nums[i +2]) {
  //             nums.splice(i,1)
  //             i--
  //         }
  //     }
  //     return nums.length

  if (nums.length == 0) return false;
  if (nums.length < 3) return false;
  let fast = 2,
    slow = 2;
  while (fast < nums.length) {
    if (nums[slow - 2] !== nums[fast]) {
      nums[slow] = nums[fast];
      slow++;
    }
    ++fast;
  }
  return slow;
  // 最终数组是什么样子的,是有slow来决定的。
  // 快慢指针的精髓在于后面的给前面的替换掉,数据是减少的
};

回文数-9

纯字符串比较。

合并有序数组-88

合并两个有序数组的问题是一个常见的算法问题。给定两个从小到大排序的数组,要求将它们合并成一个有序数组。

以下是解决这个问题的步骤:

  1. 初始化指针:为两个数组分别初始化两个指针,指向各自数组的开始位置。
  2. 比较元素:比较两个指针所指向的元素,将较小的元素添加到新的数组中,并将该数组的指针向前移动一位。
  3. 移动指针:将较小元素所在数组的指针向前移动一位。
  4. 重复步骤 2 和 3:直到其中一个数组的所有元素都被合并到新数组中。
  5. 处理剩余元素:如果一个数组的所有元素都已合并,将另一个数组的剩余元素直接添加到新数组的末尾。
  6. 返回结果:返回合并后的数组。

以下是 JavaScript 实现的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
 * @param {number[]} nums1
 * @param {number} m
 * @param {number[]} nums2
 * @param {number} n
 * @return {void} Do not return anything, modify nums1 in-place instead.
 */
var merge = function (nums1, m, nums2, n) {
  // 从后向前合并,避免覆盖nums1中未处理的元素
  let i = m - 1; // nums1中最后一个元素的索引
  let j = n - 1; // nums2中最后一个元素的索引
  let k = m + n - 1; // 合并后数组的最后一个索引

  // 比较并合并数组
  while (i >= 0 && j >= 0) {
    if (nums1[i] > nums2[j]) {
      nums1[k] = nums1[i];
      i--;
    } else {
      nums1[k] = nums2[j];
      j--;
    }
    k--;
  }

  // 如果nums2还有剩余,直接复制到nums1前面
  while (j >= 0) {
    nums1[k] = nums2[j];
    k--;
    j--;
  }
};

在这段代码中,我们从后向前遍历两个数组,这样我们可以确保在将元素复制到 nums1 时不会覆盖 nums1 中尚未处理的元素。当一个数组的所有元素都被处理后,我们检查另一个数组是否有剩余元素,并将它们复制到 nums1 的前面。这种方法可以确保合并后的数组仍然是有序的。

27-移除元素

20241119001411

交替合并字符串

接受两个参数:两个字符串,把他们交替合并。 字符串的方法,concat,合并字符串;split 传入空,按照空字符串来切割字符串,把字符串转成数组;作为可迭代数据类型,可以通过访问器传入索引的方式获取数据。

1

不知道理解的对不对:js 中,对数组,字符串的操作算法;考察的是 api 的理解和一部分的算法逻辑知识。 大厂通常倾向于考察一些高级算法,例如图,树,动态规划之类。

两数之和,三数之和,使用双指针的方法。

两数之和:

二叉树的最近公共父节点,使用后序遍历。