[LeetCode][C++]移动零

本文介绍了一种在不使用额外空间的情况下,将数组中所有零元素移至末尾同时保持非零元素顺序的方法。提供了两种实现策略,一种利用vector的特性进行元素擦除与添加,另一种采用双指针技术,分别用于检测非零元素和确定插入位置,以减少操作次数。
摘要由CSDN通过智能技术生成

移动零

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]

说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。


思路:

方法一:
借助vector自身特性,建立迭代器,发现0则擦去,并且在末尾添加0。

方法二:
设置两个指针,一个用于检测当前非零元素,另一个用于指示当前非零元素插入的位置。

代码:

方法一:

void moveZeroes(vector<int>& nums) {        
        vector<int>::iterator it=nums.begin();
        for(int i=0;i<nums.size();i++)
        {
            if(*it==0)
            {
                nums.erase(it);
                nums.push_back(0);
            }else{
                it++;
            }               
        }
    }

方法二:

void moveZeroes(vector<int>& nums){
         int insert_ind=0;
         for(int cur_ind=0;cur_ind<nums.size();cur_ind++)
         {
             if(nums[cur_ind]!=0)
             {
                 nums[insert_ind++]=nums[cur_ind];
             }
         }
         for(;insert_ind<nums.size();insert_ind++)
         {
             nums[insert_ind]=0;
         }
     }

结果:

方法一:
在这里插入图片描述

方法二:
在这里插入图片描述参考链接:
[1] 力扣 (LeetCode):移动零

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值