题目:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
分析:
方法一: 直接遍历,遇到0就删除,并在数组末尾添加见代码1
方法二: 与上一篇文章相似,方法一比较耗时,如果能够只针对非0元素进行移动,将其放到前面,时间复杂度能降低一级;见代码2,利用一个replace指针指向当前选一个替换的位置;
方法三: 遍历数组,replace指针指向遇到 第一个0 元素,此时向后遍历遇到的下一个非0元素,与replace指针指向进行交换;并记录当前非零元素位置;replace指针指向下一个 0 元素;
重复上述过程,并使用记录下来的非零元素位置开始寻找下一个非0元素;(与方法二的实现类似)
代码1:ac
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int m = nums.size();
if(!m)
return;
for(int i = 0; i < m; i++)
{
if(nums[i] == 0){
nums.erase(nums.begin() +i);
nums.push_back(0);
i--;m--;
}
}
}
};
代码2:ac
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int m = nums.size(), replace = 0;
// [0,1,0,3,12] 第一次遍历将前面所有的元素都换成非0的
for(int i = 0; i < m; i++)
{
if(nums[i] != 0){
nums[replace++] = nums[i];
}
}
for(int i = replace; i < m; i++){ // 第二次遍历将剩下的元素都置为0
nums[i] = 0;
}
}
};