删掉数组中与给出值相同的元素,返回新长度。
“The order of elements can be changed. It doesn't matter what you leave beyond the new length.”(!这是重点提示!)
【思路】
题目有了第二句就很好办了,数组顺序可以改变,超过新长度的可以不计,那么就要两个标记(指针)ij。<-双指针思想
i从前向后遍历,j从后向前,A[i]==elem时,swap(A[i], A[j])。
【my code】
int removeElement(int A[], int n, int elem) { int i,j; int length=n; for(i=0, j=n-1; i<=j; i++) { while(A[j]==elem&&j>=0){ j--; length--; } if(A[i]==elem&&j>0){ A[i]=A[j]; A[j]=elem; j--; length--; } } return length; }
【other code】
int removeElement(int A[], int n, int elem) { // Start typing your C/C++ solution below // DO NOT write int main() function int start = 0; for(int i = 0; i < n; i++) if (elem != A[i]) { A[start++] = A[i]; } return start; }
【评价】
别人的代码总是这么漂亮╮(╯﹏╰)╭
总结:双指针思想。
问题求相等/重复,就要反着思考,找到要保留的元素,从前到后按序重写,因为用来寻找的指针总是快于重写的指针,所以不会有漏掉要保留元素的情况。
切记这种思路,要省很多事。
【经验】
leecode的测试结果如果是Runtime Error,一般是因为有特殊情况没考虑到。
常常在输入参数非常小的情况。