OJ练习12——T27 Remove Element

删掉数组中与给出值相同的元素,返回新长度。

“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,一般是因为有特殊情况没考虑到。

常常在输入参数非常小的情况。

posted on 2015-04-13 15:06  EmmaLi  阅读(121)  评论(0)    收藏  举报

导航