目的
旨在记录在Leedcode网上刷题的过程,记录心得。
题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
思路
依次遍历数组,遇到0元素便开始统计step,遇到非0元素便开始移动steps,前移steps步之后,后面元素补0。移动完成之后回退到开始移动的地方重新遍历,直到完成数组遍历。
代码
class Solution {
public:
void moveForwardSteps(vector<int>& nums, int currentIndex,int steps) {
int leng = nums.size();
//从数组中第1个为0的元素开始覆盖
for (int i = currentIndex - steps; i < leng; i++)
{
if (currentIndex <leng)
nums[i] = nums[currentIndex];
else
nums[i] = 0;//前移steps步之后,后面元素补0
currentIndex++;
}
}
void moveZeroes(vector<int>& nums) {
int leng = nums.size(),steps = 0;
for (int i = 0; i < leng; i++)
{
if (nums[i] == 0) steps++;
else {
if (steps > 0) { //当需要移动时
moveForwardSteps(nums, i, steps);
i -= steps + 1;
//往前移了多少步,就回退多少步,考虑到重新进入循环会自动加1,所以再减1步
steps = 0;
}
}
}
}
};
效果