美文网首页
每天一题LeetCode【第21天】

每天一题LeetCode【第21天】

作者: 草稿纸反面 | 来源:发表于2017-02-10 00:08 被阅读93次

    T27. Remove Element【Easy

    题目

    给定一个数组和一个值,删除该值所有对应位置的值,并返回新的长度。

    不要新建另一个数组,必须使用常量内存来完成算法。

    可以更改元素的顺序。只要算出新的长度其他的都是浮云。

    思路

    怎么说呢,一开始我很天真的觉得只要返回正确的长度就好了,但是!它的 OG 机制还是要判断最后留下的数组是怎么样子的,该删的元素还得删!

    主要思路是检测到目标值,把 len-1,并从尾巴上把值填到这个值的位置

    然后要注意一点!就是这个 while ,不能用 if 来代替!举个例子:

    [3,2,2,3],要删除3的时候,用if把最后的3换到前面来,
    3还是存在并在后面不会被检测出来,会返回[3,2,2],而正确的数组是[2,2]
    

    代码

    代码取自 Top Solution,稍作注释

    哎...这代码似乎没啥好说的,就是这一句🙂

    public int removeElement(int[] A, int elem) {
        int len = A.length;
        for (int i = 0 ; i< len; ++i){
            //检测到值,把 len-1,并从尾巴上把值填到这个值的位置,如果换过来还是,继续换
            while (A[i]==elem && i< len) {
                A[i]=A[--len];
            }
        }
        return len;
    }
    

    补充

    可以了解一下 --i,和 i-- 的 区别~

    题中就是:

      A[i]=A[--len] 等价于 a=len-1;A[i]=A[a];
      A[i]=A[len--] 等价于 A[i]=A[len];a=len-1;
    

    相关文章

      网友评论

          本文标题:每天一题LeetCode【第21天】

          本文链接:https://www.haomeiwen.com/subject/vnawittx.html