美文网首页
每天一题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