algorighm/leetcode/简单/移除元素(25).js

66 lines
2.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
给你一个数组 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);