Given an array and a value, remove all instances of that value in place and return the new length.
The order of elements can be changed. It doesn't matter what you leave beyond the new length.
思路一:两个指针 i、j 分别向后,j 进行定位。将 A[j] 赋给 A[i],j和i都往后走。
关于两个指针的问题,一定要注意 j 在定位时一定不能超出范围, 很多其他的这种定位操作也需要注意。
class Solution {
public:
int removeElement(int A[], int n, int elem) {
if(n == 0) return 0;
int i = 0, j = 0;
while(j < n) {
while(A[j] == elem) {
j++; //除虫
if(j == n) {
if(i == 0) {
return (A[0] == elem ? 0 : 1);
} else {
return i;
}
}
}
A[i] = A[j];
i++;
j++;
}
return i;
}
};
这里可以使用A[i++] = A[j++]; 更加简洁。和*p++ == *q++差不多,*优先级更高,但是p++操作时,汇编代码中会创建一个p副本,或者直接先算*p。
思路二:条条大路通罗马呀
class Solution {
public:
int removeElement(int A[], int n, int elem) {
if(n==0) return 0;
int start=0, end=n-1;
while(start<end){
while(start<end&&A[start]!=elem) start++;
while(start<end&&A[end]==elem) end--;
swap(A[start],A[end]);
}
if(A[start]==elem) return start;
else return start+1;
}
};