题目地址:移除元素
看到这个题目的第一反应,就是新建一个新数组将需要的元素复制进去,去掉不需要的元素,但这里明确要求不能使用额外的数组空间,就会想到将需要移除的元素覆盖掉,用两个指针,起始点相同,一个指针移动时跳过需要移除的元素,直到移动到需要保留的元素位置,将值赋给另外一个指针,每次覆盖完成共同前进一步,直到快的指针到达末尾。
class Solution {
public int removeElement(int[] nums, int val) {
int i = 0;
for (int j = 0; j < nums.length; j++) {
if(nums[j]!=val){
nums[i]=nums[j];
i++;
}
}
return i;
}
}
结果:
另外一种方法确实没想到,当要删除元素比较少时,可将当前元素与最后一个元素交换来达到目的。注意交换完成后,仍然需要检查从最后交换过来的元素是否是需要删除的元素。
class Solution {
public int removeElement(int[] nums, int val) {
int i = 0;
int n=nums.length;
while (i<n){
if(nums[i]==val){
nums[i]=nums[n-1];//注意数组长度比数组最大下标大1
n--;
}
else
i++;
}
return n;
}
}
结果: