给你一个数组 nums[] 和一个值 val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
public class 移除元素 {
public static void main(String[] args) {
int[] nums = new int[]{0, 1, 3, 3, 4, 4, 5, 6, 6, 3};
int val = 3;
// int n = baoliDeal(nums, val);
removeElement(nums, val);
}
/**
* 暴力破解很简单,把数组遍历一遍,放到新数组即可
*/
public static int baoliDeal(int[] nums, int val) {
int length = nums.length;
int[] result = new int[length];
int j = 0;
for (int i = 0; i < length; i++) {
if (nums[i] != val) {
result[j] = nums[i];
j++;
}
}
for (int i = 0; i < j; i++) {
System.out.print(result[i]);
}
return j;
}
/**
* 下面的拷贝覆盖和交换移除都是针对官方的双指针解法进行的代码数量优化,实质一样的
*/
public static int removeElement(int[] nums, int val) {
/**
* 拷贝覆盖
*/
// int ans = 0;
// for (int num : nums) {
// if (num != val) {
// nums[ans] = num;
// ans++;
// }
// }
// return ans;
/**
* 交换移除:亮点在于 for 循环最后没有 i++ 的代码。所以在和最后一个元素交换之后还会继续检查交换之后的元素是否相同
*/
int ans = nums.length;
for (int i = 0; i < ans;) {
if (nums[i] == val) {
nums[i] = nums[ans - 1];
ans--;
} else {
i++;
}
}
return ans;
}