一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
一起来学点算法,这里是慢慢学算法,我是小coder,昨天我们学习了过滤数组,今天我们依旧来实践过滤思想。
题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
题目分析
给定nums是数组,题目要求我们去0,还要保持非零元素的相对顺序,那我们只需要按顺序依次保留元素,非零位置补0即可:
- 删除0元素:意味着改变数组长度,但题目要求原地修改,不选。
- 移动0元素:需要判断0元素,过于复杂,不选。
- 过滤0元素:留下非零元素的,不足位置补0,满足题目要求,可选。
解题思路
- 确定操作数组:本题中,操作数组就一个nums
- 确定操作条件:操作条件为去0,如果当前元素不是0,我们就要这个。
- 确定操作过程:操作过程为把要的元素按顺序放好,空余位置补0即可。
- 确定结果返回:无返回
代码
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元素 解决本题,我们依旧使用过滤思想,其它方法过于复杂,计算机解题的时候看的不是过程,而是最终结果,比如我们要求移动,并不是非要移动,可以通过过滤补元素的方法来完成,我们也不需要要原来元素的相对位置,这对我们来说是最简单的方法。
我愿意称之为抽象思维。