LeetCode第283题:移动零(C++)

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

请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

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

输入: nums = [0]
输出: [0]
 

提示:

1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/move-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

在评论区看见的指针解法,记录一下,方便回顾

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
             int* left = &nums[0];//创建指向开头的指针
             int* right = &nums[nums.size()-1];//创建指向结尾的指针
            //也可以换成while(left < right)
             while(left != right){//当左指针不等于右指针的时候循环进行
                 if(*left == 0){
                     int* p = left;
                     while(right != p){//也可以换成while(p < right)
                         *(p) = *(p+1);//将0后的元素前移
                         p++; 
                     }
                     *right = 0;//把右指针赋0
                     right--;
                     
                 }else{
                    left++;
                 }
             }

        }
    };

 还有我自己写的解法:(翻转)

class Solution {
public:
    void reverse(vector<int>& nums, int left, int right){
        while(left < right){
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
            left++;
            right--;
            
        }
    }
    //翻转的方法
    void moveZeroes(vector<int>& nums) {
        int left = 0, right = nums.size() - 1;
        while(left < right ){
            while(nums[right] == 0 && right > 0){//如果末尾是0不用动
                right--;
                if(left == right){//应对全是0的情况
                    return;
                }
            }
            if(nums[left] == 0){
                reverse(nums,left,right);//把0翻转到最后
                right--;
                while(nums[right] == 0 ) right--;//翻转后如果末尾为0不用动
                reverse(nums,left,right);//把翻转过来的开头和结尾都不为0的翻转回去
            }
            left++;
        }

    }
};

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值