LeetCode 之 Remove Element

原题:

Given an array and a value, remove all instances of that value in place and return the new length.

The order of elements can be changed. It doesn't matter what you leave beyond the new length.

看到原题第一反应是先把所有的和key相等的数找出来,然后往前挪!!!但是一想,不对啊,尼玛这就扫描了两次代码,作为一名程序猿,不能让这种事情发生。good,哥想了一个方法:

1 由于需要把跟key相等的数的位置由右面的数填补,因此需要记录新数组的最后一个元素的位置,我称之为last

2 由于扫描到某个数若是key时,需要这个数之后的数字复制到新的数组中,由于新数组较短,直接在原数组中进行。。。

3从头开始扫描数组,用两个指针(学渣其实是用了俩int来作为数组的角标代表的)来分别指向last现在所检测的位置(我称之为current)

4每次扫描一个数,判断是否和key相等,若相等,只有current++,若不等,二者都++,且判断当前位置是否和last相等,不等则粘贴过去!!!如图所示:

                                       

                                                                                       图1   说明


最后的代码如下:

class Solution {
public:
    int removeElement(int A[], int n, int elem) {
        // IMPORTANT: Please reset any member data you declared, as
        // the same Solution instance will be reused for each test case.
        
        int last = 0;
        int current = 0;
    
        
        for (int i = 0 ; i  <n ;i++){
            current = i;
            //如果与key不相等,需要判断是否需要进行复制操作,且新数组的大小加1
            if(A[i] != elem){
                //如果当前的位置需要向前复制
                if(current != last){
                    //复制过去
                    A[last] = A[current]; 
                }
                 last ++ ;
            }
        }
        return last;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值