题意:
解法一:
使用两个下标 cur 和 end,cur 从后向前遍历,当遇到元素 0 时,根据 end 与 cur 的差值 count,将 count 个非零元素整体向前移动 1 位,end 处的元素置 0。以此类推。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int cur = nums.size() - 1;
int end = nums.size() - 1;
int count = 0;
while(cur >= 0){
if(0 == nums[cur]){
count = end - cur;
for(int i = 0; i < count; ++i)
nums[cur + i] = nums[cur + i + 1];
nums[end] = 0;
--end;
}
--cur;
}
}
};
解法二:
使用两个下标 i 和 j,j 记住第一个 0 元素的位置,i 遍历数组,遇到非零元素时与 j 所指 0 元素交换,然后 j 向后移动 1 位,仍然指向第一个 0 元素。以此类推。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
for(int i = 0, j = 0; i < nums.size(); ++i)
if(nums[i])
swap(nums[i], nums[j++]);
}
};
解法二明显比解法一好。