给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
我的思路:
1.循环遍历发现重复元素,所有该元素后的元素前进一,覆盖掉重复元素
2.发生重复,记录减少元素次数,数组长度变化,最后返回长度
下面为我的测试代码
public class RemoveElement27 {
public int removeElement(int[] nums, int val) {
int step=0; //减去的元素个数
int k; //用来替代i做数组元素覆盖
for (int i = 0; i < nums.length-step; i++) {//数组长度-减少的元素个数
if(nums[i]==val) {
k=i;
step++;
while(k<nums.length-step) {//从重复元素以后全部前进一位
nums[k]=nums[k+1];
k++;
}
i--; //因为元素前进一位,所以减一从当前位置在开始循环
}
}
return nums.length-step;
}
public static void main(String[] args) {
RemoveElement27 a = new RemoveElement27();
int[] nums= {0,1,2,2,3,0,4,2};
System.out.println("遍历前元素"+"\n");
for (int i = 0; i < nums.length; i++) {
System.out.print(nums[i]+"\t");
}
System.out.println();
int val = 2;
int length=a.removeElement(nums, val);
System.out.println("\n"+"删除元素的为"+val+"\n");
for (int i = 0; i < length; i++) {
System.out.print(nums[i]+"\t");
}
}
}
最终提交代码:
class Solution {
public int removeElement(int[] nums, int val) {
int step=0;
int k;
for (int i = 0; i < nums.length-step; i++) {
if(nums[i]==val) {
k=i;
step++;
while(k<nums.length-step) {
nums[k]=nums[k+1];
k++;
}
i--;
}
}
return nums.length-step;
}
}