栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

2021-10-11 力扣题第283 移动零

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

2021-10-11 力扣题第283 移动零

移动零 题目解析


根据题目要求,我们需要将数组中的0全部移动到数组的末尾,同时又要保证非零元素原有的顺序,并且直接在数组上进行交换的操作。

那么,最简单的想法就是,每搜索到一个0,就提出来放到数组最后,其他元素整体前移一位。但因为不让使用额外数组存储,依次移动的话需要额外花费的操作和时间太多了。所以我们使用双指针的方式来实现。

代码实现

设定i和j两个指针,i用于搜索非零元素,j用于搜索0元素。两个指针分别用两个for循环从左向右搜索,当搜索到“当前未处理的第一个”非0元素、0元素,跳出循环,此时所记录的i、j的位置就是第一个非0元素、0元素的位置。若记录下来的i大于j,说明该0元素在未处理部分第一个非0元素之前,则将i位置非零元素赋值给j位置,使i位置元素为0。

此时i位置为0,j位置为非0。那么进入下一个循环,i、j会继续向后搜索未处理过的数组部分的第一个非0和0元素。以此类推,直至i或者j超出数组长度,则说明全部数组都处理完成了。

class Solution {
public:
    void moveZeroes(vector& nums) {
        int i = 0, j = 0;
        int t = 0;

        while(i < nums.size()){
            for(i; i < nums.size(); i++){
                if(nums[i] != 0) break;
            }
            if(i >= nums.size()) return;
            for(j; j < nums.size(); j++){
                if(nums[j] == 0) break;
            }
            if(j >= nums.size()) return;
            if(i > j){
                nums[j] = nums[i];
                nums[i] = 0;
            }
            i++;
        }
    }
};
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/317365.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号