给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
我的解法:从头往后遍历,如果相等,删除该元素,并将后面的元素前移
public class Solution {
public int removeElement(int[] nums, int val) {
int lenth=nums.length-1;
int index=0;
while (true){
if (lenth==-1){
return 0;
}
if(val==nums[index]){
for (int i = index; i < lenth; i++) {
nums[i]=nums[i+1]
; }
lenth--;
index--;
}
index++;
if(lenth==index){
if(val==nums[index]){
lenth--;
}
break;
} else if (lenth<index) {
break;
}
}
return lenth+1;
}
}
题解方法:分成两半,一半有效,一半无效,交换位置。
public class Solution {
public int removeElement(int[] nums, int val) {
int j=nums.length-1;
for (int i=0;i<=j;i++){
if(nums[i]==val){
swapNum(nums,i,j);
i--;//精髓所在,再检查一遍换过来的是不是目标值
j--;
}
}
return j+1;
}
private void swapNum(int[] nums, int i, int j) {
int temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}
}