1. 删除有序数组中的重复项
给你一个 非严格递增排列 的数组 nums ,请你原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。
你可以使用 JavaScript 来实现这个功能。下面是一个简单的实现方法,通过遍历数组并使用一个指针来原地删除重复的元素。具体步骤如下:
- 初始化一个指针
i,用于指向结果数组的末尾。 - 遍历数组
nums,如果当前元素与nums[i]不同,则将其放在i+1的位置并移动指针i前进。 - 最后,返回
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 个元素
代码解释:
- 变量定义:
-
count:用于计数,记录不等于val的元素的数量。
- 遍历数组:
-
- 用一个
for循环遍历nums数组。
- 用一个
- 元素检查:
-
- 如果当前元素
nums[i]不等于val,就将它放到nums数组的前面部分(即count指向的位置),然后将count增加 1。
- 如果当前元素
- 返回结果:
-
- 遍历完成后,
count的值就是数组中不等于val的元素数量,函数返回这个值。
- 遍历完成后,
这种方式是原地操作,不需要额外的存储空间,符合题目要求。