数组02_删除元素

删除数组元素

在一个无序数组中,将数组中的指定元素删除。将设数组长度为n,其中包含m个只为val的元素,需要将数组中m个值为val的元素删除,剩下长度为n-m的数组,后面m个元素值任意,前面m-n个元素为删除之后的剩余元素。

关键点在于数组的元素不能删除只能覆盖或者替换。

  • 直接法

    遍历找到需要删除的元素之后,该元素后面的元素一次向前移动,将该元素覆盖。

    class Solution {
    public:
        int removeElement(vector<int>& nums, int val) {
            int res = 0, len = nums.size();
            for(int i = 0; i < len; i++){
                if(nums[i] == val){
                    len--;
                    for(int j = i; j < len; j++)
                        nums[j] = nums[j+1];
                    i--;   //移动后的第i个位置的元素重新判断是否需要删除
                }       
            }
            return len;
        }
    };
    
  • 直接法改进

    首先记当前数组的最后一个元素下标为last=len-1,向后遍历寻找需要删除的元素,找到需要删除的元素后,从last向前last–遍历寻找不需要删除的元素位置,找到之后将两者交换,再最后一个元素位置为last = last-1

    class Solution {
    public:
        int removeElement(vector<int>& nums, int val) {
            int res = 0, len = nums.size();
            int j = len - 1;
            for(int i = 0; i < len; i++)
            {  
                if (nums[i] == val)
                {
                    //j = len - 1;
                    while(j > i && nums[j] == val){
                        j -- ;  
                    }
                    if (j > i){
                        nums[i] = nums[j];
                        nums[j] = val;
                        len = j + 1;
                        res ++;
                        j --;
                    } 
                    else break;
                }
                else res++;
            }
            return res;
        }
    };
    //重新修改后
    class Solution {
    public:
        int removeElement(vector<int>& nums, int val) {
            int res = 0, len = nums.size();
            int last = len - 1;
            for(int i = 0; i <= last; i++)
            {  
                if (nums[i] == val){
                    while(last > i && nums[last] == val){
                        last -- ;  
                    }
                    if (last >= i){  //此处如果写为>,则输入[0],0时,输出错误结果
                        nums[i] = nums[last];
                        //nums[last] = val;
                        last--;
                    }
                    else break;
                } 
            }
            return last+1;
        }
    };
    
  • 双指针法

    用快指针来遍历数组,用满指针来表示遍历到第i个元素时,新数组最后一个元素的位置

    class Solution {
    public:
        int removeElement(vector<int>& nums, int val) {
            int last = 0;
            for(int i = 0; i < nums.size(); i++)
            	if(nums[i] != val){
                    nums[last] = nums[i];
                    last++;
            	}
            return last;
        }
    };
    
    //另一种写法,通过统计需要删除元素的数量来确定第i个元素的新位置
    class Solution {
    public:
        int removeElement(vector<int>& nums, int val) {
            int numDel = 0;
            for(int i = 0; i < nums.size(); i++)
            {
            	if(nums[i] == val)
                    numDel++;
                else
            	    nums[i - numDel] = nums[i];   
            } 	
            return nums.size()-numDel;
        }
    };
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值