首页 > 其他分享 >283. 移动零

283. 移动零

时间:2024-11-07 18:20:09浏览次数:4  
标签:slow nums ++ fast right 283 移动 left

题目

自己写通过的:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int slow = 0, fast = 0;
        while (fast < nums.size())
        {
            if (nums[slow] == 0 && nums[fast] != 0) 
            {
                nums[slow] = nums[fast];
                nums[fast] = 0;
            }
            if (nums[slow] != 0) slow ++;
            fast ++;
        }
    }
};

基本思想就是在更换时一定是要nums[slow] == 0nums[fast] != 0同时满足,然后slow查找值为0的位置,当找到值为0的位置时,就不动了,直到更换了两个数,导致这个slow位置的数不为0,然后执行slow ++,至于fast则是从头到尾遍历整个数组,找出值不为0的位置,然后在nums[slow] == 0 && nums[fast] != 0满足时,更换位置,注意每次while循环都要执行fast ++

然后就是在做这题的时候自己也踩了些坑,感觉还是有必要写下的:

第一个坑就是读题目的时候有点粗心,没看清楚全部要满足的条件,导致第一次写的时候写了如下代码:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int left = 0, right = nums.size() - 1;
        while (left < right)
        {
            if (nums[left] == 0)
            {
                nums[left] = nums[right];
                nums[right] = 0;
                right --;
            }
            else left ++;
        }
    }
};

这段代码虽然也能把所有 0 移动到数组的末尾,但是没有保持非零元素的相对顺序。

第二个坑就是有点想当然,直接把slow ++放第一个if里面了,也就是如下代码:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int slow = 0, fast = 0;
        while (fast < nums.size())
        {
            if (nums[slow] == 0 && nums[fast] != 0) 
            {
                nums[slow] = nums[fast];
                nums[fast] = 0;
                slow ++;
            }
            fast ++;
        }
    }
};

错误的原因就是认为当更换两个位置的数时,要让slow ++,但是没考虑到当slow对应的元素不为0时,也要让slow ++,因为要让slow位置的元素为0,等待right位置的不为0的元素来进行交换。

再附上分析的两张图:

img

第二张图其实就是我踩的第二个坑的第一个不通过的案例

img

最后看了下官方题解,也有些收获

img

官方代码:

class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int n = nums.size(), left = 0, right = 0;
        while (right < n) {
            if (nums[right]) {
                swap(nums[left], nums[right]);
                left++;
            }
            right++;
        }
    }
};

感觉官方思路是从一个更大的更宏观的角度去考虑的,刚开始并没有考虑left,而是从right出发,用right来遍历整个数组,看right位置的数值是不是不为0,如果不为0,则一定是放在前面的,也就是slow位置,然后再slow ++,来满足左指针左边均为非零数,同时为下个可能要更换的数做准备;

标签:slow,nums,++,fast,right,283,移动,left
From: https://www.cnblogs.com/hisun9/p/18533740

相关文章

  • 算法每日双题精讲——双指针(移动零,复写零)
    ......
  • 题解:P11248 [GESP202409 七级] 矩阵移动
    题目传送门题目大意给出一个nnn行mmm列的只包含0、1、?的矩......
  • Node.js——fs模块-文件重命名和移动
    1、在Node.js中,我们可以使用rename或renameSync来移动或重命名文件或文件夹2、语法:fs.rename(oldPath,newPath,callback)fs.renameSync(oldPath,newPath)参数说明:oldPath文件当前的路径newPath文件新的路径callback操作后的回调函数本文的分享到......
  • 传统媒体终端移动化发展新趋势:融合开源 AI 智能名片与 S2B2C 商城小程序的创新探索
    摘要:本文围绕传统媒体在新媒体环境下终端移动化的发展展开论述。阐述了传统媒体终端移动化的现状、“三网融合”带来的技术保障以及智能终端和移动互联网技术对其转型的推动作用。进一步探讨将开源AI智能名片和S2B2C商城小程序融入传统媒体终端移动化发展的创新模式、潜在......
  • 在 Windows 中,使用 命令提示符(CMD) 移动文件与在 图形用户界面(GUI) 中使用剪切和粘贴功
    在Windows中,使用命令提示符(CMD)移动文件与在图形用户界面(GUI)中使用剪切和粘贴功能的速度差异,实际上取决于几个因素。这里是对这两种方式的比较:1. CMD移动文件(使用 move 命令):基本操作:CMD中的 move 命令是将文件从一个位置移动到另一个位置。如果目标文件夹和源文件......
  • 移动H5前端性能优化指南
    目录加载优化JavaScript优化CSS优化渲染优化交互优化HTML与视口网络与资源加载优化图像与媒体优化资源压缩与合并执行环境优化用户交互体验优化性能监测与调试概述移动H5应用的性能优化是确保用户获得流畅体验的关键。优化目标包括减少加载时间、提高运行效率和降低资源......
  • 计算机毕业设计Python+大模型新能源汽车销量预测 汽车销量分析可视化 汽车爬虫 深度学
    温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!温馨提示:文末有CSDN平台官方提供的学长联系方式的名片!作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO......
  • 即时可玩web小游戏(二):打砖块(支持移动端版) - 集成InsCode快来阅读并即时体验吧~
    建议全屏或者新页面运行、首次运行需要冷启动,时间要一点,不如倒杯茶去~白屏也是需要等一下即可已经实现的游戏一览:俄罗斯方块游戏界面游戏实现解析代码参考Inscode-查看文件即可,在本节,我将分步解析一个使用HTML5Canvas和JavaScript实现的经典打砖块游戏。通......
  • 移动优先索引的时代:如何提升网站的搜索表现
    内容概要在数字时代,搜索引擎技术不断进步,移动优先索引应运而生。该概念的核心在于,搜索引擎更侧重于网站在移动设备上的表现,从而影响其在搜索结果中的排名。这一转变使得网站的移动端优化显得尤为重要,因为越来越多的用户通过手机或平板访问互联网。为了迎合这一趋势,网站所有者......
  • 移动0
    移动0题目给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意,必须在不复制数组的情况下原地对数组进行操作。示例输入:nums=[0,1,0,3,12]输出:[1,3,12,0,0]思路使用快慢指针,快指针指向遍历的新元素,慢指针指向已经处理好......