zoukankan      html  css  js  c++  java
  • 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,一般是因为有特殊情况没考虑到。

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

  • 相关阅读:
    LeetCode_222.完全二叉树的节点个数
    LeetCode_219.存在重复元素 II
    LeetCode_217.存在重复元素
    LeetCode_215.数组中的第K个最大元素
    LeetCode_21.合并两个有序链表
    LeetCode_206.反转链表
    LeetCode_205.同构字符串
    LeetCode_202.快乐数
    LeetCode_20.有效的括号
    LeetCode_2.两数相加
  • 原文地址:https://www.cnblogs.com/ketchups-notes/p/4422241.html
Copyright © 2011-2022 走看看