解法一
倒着遍历数组,元素若与val相同直接删除,最后将数组长度返回。
/*
* @lc app=leetcode.cn id=27 lang=javascript
*
* [27] 移除元素
*/
// @lc code=start
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
var removeElement = function(nums, val) {
for(let i = nums.length ; i >= 0 ; i--){
if(nums[i] == val){
nums.splice(i,1);
}
}
return nums.length;
};
// @lc code=end
解法二
数组元素置换问题,双指针 一个指向数组起始位置 left, 一个指向数组结束位置 right
然后经过遍历,left 从左往右找到第一个不为val的下标, right 从右往左找到第一个为val的下标, 将两个元素位置互换。
结束标志是left >= right
说明中间点左侧都是非val, 中间点右侧都是val了
最后看如果 nums[left] == val
即说明 左侧非val的长度为left, 否则非val的长度为left+1
/*
* @lc app=leetcode.cn id=27 lang=javascript
*
* [27] 移除元素
*/
// @lc code=start
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
var removeElement = function(nums, val) {
if(!nums || nums.length == 0){
return 0;
}
let left = 0;
let right = nums.length - 1;
while(left < right){
while(left < right && nums[left] != val){
left++;
}
while(left < right && nums[right] == val){
right--;
}
let temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
if( nums[left] == val){
return left;
}else {
return left + 1;
}
};
// @lc code=end