Given an array nums and a value val
, remove all instances of that value in-place and return the new length.
Origin:
/**
* 遍历数组,一但遇到等于val的值就用数组尾部的元素给该位置赋值,并将尾部提前一位
* 用length记录和更新到当前位置删去val值后剩余的元素个数,尾部下标始终为length - 1
*/
Solution {
public int removeElement(int[] nums, int val) {
int length = nums.length; // 记录返回长度
for (int i = 0; i < length; ) { // 要求i小于length,因为从length位置开始的数据都已经用于覆盖之前的val值
if (nums[i] == val) {
nums[i] = nums[length - 1]; // 用尾部的值覆盖当前位置的val值
length--; // 尾部提前一位
} else
i++; // 当前位置的值不等于val,直接判断下一个值
}
return length;
}
}
Simplified:
/**
* 缩短自己的原始代码
* 不能用for (int i : nums)是因为数组中的val被尾部提上来的元素覆盖后,不能直接访问下一个元素,而要继续判断覆盖元素是否为val,这需要操作下标
*/
class Solution {
public int removeElement(int[] nums, int val) {
int length = nums.length;
for (int i = 0; i < length; i++)
if (nums[i] == val)
nums[i--] = nums[length-- - 1];
return length;
}
}
/**
* 另一种思路
* 前面的思路是遇到等于的就用尾部将其覆盖;这里的思路是遇到不等于的就赋值给首部
* 这样操作出来结果的顺序和原数组中的顺序是一致的
*/
class Solution {
public int removeElement(int[] nums, int val) {
int length = 0;
for (int i : nums)
if (i != val)
nums[length++] = i;
return length;
}
}