题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/move-zeroes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解1
思路同这道题类似,只是多了一个赋0的操作。
第一种思路:将非0的元素前移,移动的距离为当前位置前面的0的个数。
代码1
/*
思路类似 删除数组值为0的无素
只是比其多了一步,为最后几个元素赋0
*/
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int cnt = 0, len = nums.size();
for(int i = 0; i < len; ++i){//统计0的个数并移动元素
if(nums[i] == 0){
++cnt;
}
else{
nums[i - cnt] = nums[i];
}
}
for(int i = len - 1; i >= len - cnt; --i){//将最后几个元素赋值为0
nums[i] = 0;
}
}
};
执行结果1
题解2
双指针,一个用于遍历原数组,另一个用于将非0元素填入原数组。
代码2
/*
双指针,一个用于遍历原数组,另一个用于赋值
*/
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int i = 0, j = 0, len = nums.size();
for(; i < len; ++i){
if(nums[i] != 0){
nums[j++] = nums[i];
}
}
for(j; j < len; ++j){
nums[j] = 0;
}
}
};