/* 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作: 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。 返回 k。 */ // 示例 1: // 输入:nums = [3,2,2,3], val = 3 // 输出:2, nums = [2,2,_,_] // 解释:你的函数函数应该返回 k = 2, 并且 nums 中的前两个元素均为 2。 // 你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。 /** * @param {number[]} nums * @param {number} val * @return {number} * 思路:题目只需要我们修改元素组,并且保证元素组的前k个元素是于val不同即可,脑袋里面想到的第一个思路,就是遍历一遍把 * 这k个与val不同的元素找出来,存入一个新的数组,之后再遍历新数组,把这k个元素替换到元素组 */ const removeElement1 = function (nums, val) { const arr = []; let k = 0; for (const num of nums) { if (num !== val) { arr.push(num); k++; } } for (let i = 0; i < arr.length; i++) { nums[i] = arr[i]; } return k; }; /** * * @param {number[]} nums * @param {number} val * @returns number * 思路:使用快慢指针,快指针遍历整个数组,找出与val不同的元素,快慢指针初始都指向第一个元素,当快指针找到 * 与val不同的元素的时候就把当前元素的值赋值给慢指针的位置,之后慢指针往后移动一位,重复上一次操作。 * * 思考:因为快指针会优先移动去寻找与val不同的元素,所以一次遍历下来能找到所有的与val不同的元素,当找到时,slow所在 * 的位置一定是无效位置,要么时与val值相同的位置,要么是已经赋值之后的无效位置,所以不用担心值被覆盖的问题 */ function removeElement(nums, val) { let slow = 0; // 慢指针,指向不等于 val 的部分末尾 for (let fast = 0; fast < nums.length; fast++) { if (nums[fast] !== val) { nums[slow] = nums[fast]; slow++; } } return slow; // 新数组长度 } const testArr = [3, 2, 2, 3]; removeElement(testArr, 3); console.log(testArr);