思路
-
维护两个指针,slow指针找到0,fast指针找到在slow指针后,不为0的元素,然后将这两个元素交换。
-
维护两个指针i和j,如果当前元素非0,则两个指针都向前移动,如果当前元素为0,则i向前移动,j不动,这样j便指向列0,此后j一直指向0。如果当前元素非0,则交换i指针和j指针指向的元素。
-
维护两个指针i和j。如果i指向的元素非0,则使用i指向的元素覆盖j指向的元素。如果i指向的元素为0,则什么也不做。在这个解法中,j指针与i指针之间的元素都已经遍历过,这些元素中,非0的部分已经覆盖了j之前的元素,因此,这些元素可以被覆盖,为0的部分将会被i之后的元素覆盖。当i遍历结束时,将j之后的元素全部赋0即可。
代码
方法1
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int slow = 0, fast = 0;
while (true) {
while (slow < nums.size() && nums[slow]) ++slow;
fast = max(fast, slow);
while (fast < nums.size() && !nums[fast]) ++fast;
if (slow < fast && slow < nums.size() && fast < nums.size())
swap(nums[slow], nums[fast]);
else break;
}
return ;
}
};
方法2
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int slow = 0, fast = 0;
while (fast < nums.size()) {
if (nums[fast]) {
swap(nums[slow], nums[fast]);
++slow;
}
++fast;
}
}
};
方法3
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int j = 0;
for (int i = 0; i < nums.size(); ++i) {
if (nums[i])
nums[j++] = nums[i];
}
for (; j < nums.size(); ++j)
nums[j] = 0;
}
};