面向小白的力扣283移动零题解

154 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

一起来学点算法,这里是慢慢学算法,我是小coder,昨天我们学习了过滤数组,今天我们依旧来实践过滤思想。

题目描述

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

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

示例 1:

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

示例 2:

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

题目分析

给定nums是数组,题目要求我们去0,还要保持非零元素的相对顺序,那我们只需要按顺序依次保留元素,非零位置补0即可:

  1. 删除0元素:意味着改变数组长度,但题目要求原地修改,不选。
  2. 移动0元素:需要判断0元素,过于复杂,不选。
  3. 过滤0元素:留下非零元素的,不足位置补0,满足题目要求,可选。

解题思路

  1. 确定操作数组:本题中,操作数组就一个nums
  2. 确定操作条件:操作条件为去0,如果当前元素不是0,我们就要这个。
  3. 确定操作过程:操作过程为把要的元素按顺序放好,空余位置补0即可。
  4. 确定结果返回:无返回

代码

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

题目总结

此题过滤条件为:0元素 解决本题,我们依旧使用过滤思想,其它方法过于复杂,计算机解题的时候看的不是过程,而是最终结果,比如我们要求移动,并不是非要移动,可以通过过滤补元素的方法来完成,我们也不需要要原来元素的相对位置,这对我们来说是最简单的方法。

我愿意称之为抽象思维。