数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
暴力解法:
暴力解法就是两层for循环,一个for循环遍历数组元素,第二个for循环更新数组。
代码:
class Solution{
public int removeElement(int[] nums, int val) {
int len=nums.length;
for(int i=0;i<len;i++){
if(nums[i]==val){//发现需要移除的元素,数组集体向前移到一位
for(int j=i+1;j<len;j++){
nums[j-1]=nums[j];
}
i--;//下标i以后的元素都向前移动了一位,所以i也向前移动一位
len--;//此时数组的大小减一
}
}
return len;
}
}
双指针法:
通过一个块指针和一个慢指针在一个for循环下完成两个for循环的工作。
-
快指针:寻找新元素的数组,新元素就是不含有目标值的数组
-
慢指针:指向更新新数组下标的位置
快指针遇到目标值就指向下一个,否则慢指针指向的数组元素更新为快指针指向数组元素。
代码:
class Solution {
public int removeElement(int[] nums, int val) {
int slowIndex=0;
for(int fastIndex=0;fastIndex<nums.length;fastIndex++){
if(val!=nums[fastIndex]){
nums[slowIndex]=nums[fastIndex];
slowIndex++;
}
}
return slowIndex;
}
}