9.png 10.png

解法一

倒着遍历数组,元素若与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