问题描述
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
解题思路
我的思路:考虑到我们不需要考虑超出长度范围外的数组内容,于是我们可以从数组末尾开始便利,遇到val就从末尾数组中找一个值进行替换,最终的结果是所有非val的值都会被替换到前面有效长度内。
class Solution {
public int removeElement(int[] nums, int val) {
//
//从数组末尾定位位置
int local = nums.length-1;
//从数组的末尾开始遍历,方便把val往后面丢
for(int i = nums.length - 1; i>=0; i--){
//遇到相同的就丢到后面,local往前移动一个位置
if(nums[i] == val){
nums[i] = nums[local];
local--;
}
}
//return nums.length - (nums.length - 1 - local)
return local + 1;
}
}