力扣两道简单算法题

99 阅读3分钟

1. 删除有序数组中的重复项

给你一个 非严格递增排列 的数组 nums ,请你原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

你可以使用 JavaScript 来实现这个功能。下面是一个简单的实现方法,通过遍历数组并使用一个指针来原地删除重复的元素。具体步骤如下:

  1. 初始化一个指针 i,用于指向结果数组的末尾。
  2. 遍历数组 nums,如果当前元素与 nums[i] 不同,则将其放在 i+1 的位置并移动指针 i 前进。
  3. 最后,返回 i + 1 作为新数组的长度。

以下是该算法的示例代码:

function removeDuplicates(nums) {
    if (nums.length === 0) return 0;

    let i = 0; // 指向结果数组的索引

    for (let j = 1; j < nums.length; j++) {
        if (nums[j] !== nums[i]) {
            i++; // 移动指针
            nums[i] = nums[j]; // 将不重复元素放到结果数组中
        }
    }

    // 返回新数组的长度
    return i + 1;
}

// 示例用法
let nums = [1, 1, 2, 2, 3, 4, 4, 5];
let newLength = removeDuplicates(nums);
console.log(newLength); // 输出: 5
console.log(nums.slice(0, newLength)); // 输出: [1, 2, 3, 4, 5]

在这个例子中,removeDuplicates 函数将原地删除数组中的重复元素,并返回唯一元素的个数。同时,数组 nums 将被修改为包含唯一的元素。

解释:

  • i 初始为 0,表示唯一元素的最后一个索引。
  • j 从 1 开始循环,检查每个元素是否与 nums[i] 不同。
  • 如果不同,则说明找到了一个新的唯一元素,将其放在 nums[i + 1] 中,并将 i 增加一。
  • 最终返回 i + 1,即数组中唯一元素的长度。

这种方法是原地的,只需 O(1) 的额外空间,并且时间复杂度为 O(n)。

2. 移除元素

给你一个数组 nums **和一个值 val,你需要 原地 移除所有数值等于 val **的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。

  • 返回 k

可以通过 JavaScript 实现一个函数,来原地移除数组中所有与给定值相等的元素,并返回数组中不等于该值的元素的数量。我们可以用双指针的方法来实现这个功能。

以下是实现代码:

function removeElement(nums, val) {
    let count = 0; // 计数器,用于记录不等于 val 的元素数量

    // 遍历整个数组
    for (let i = 0; i < nums.length; i++) {
        // 如果当前元素不等于 val
        if (nums[i] !== val) {
            // 将当前元素放到 count 指向的位置
            nums[count] = nums[i];
            // 增加计数器
            count++;
        }
    }

    // 返回不等于 val 的元素的数量
    return count;
}

// 示例用法
let nums = [3, 2, 2, 3];
let val = 3;
let newLength = removeElement(nums, val);

console.log(newLength); // 输出: 2
console.log(nums.slice(0, newLength)); // 输出: [2, 2],前 2 个元素

代码解释:

  1. 变量定义
    • count:用于计数,记录不等于 val 的元素的数量。
  1. 遍历数组
    • 用一个 for 循环遍历 nums 数组。
  1. 元素检查
    • 如果当前元素 nums[i] 不等于 val,就将它放到 nums 数组的前面部分(即 count 指向的位置),然后将 count 增加 1。
  1. 返回结果
    • 遍历完成后,count 的值就是数组中不等于 val 的元素数量,函数返回这个值。

这种方式是原地操作,不需要额外的存储空间,符合题目要求。