0%

题意

题目链接:Move Zeroes

给一个数组,通过交换将所有非零元素放置在前面,将所有零元素放置在后面。

要求In-place,即不能使用额外的空间存放数组元素。

另外还要求交换次数最少。

思路

为了满足题目要求,我们可以使用双指针法,找到一个零元素,以及在它后面的非零元素,将两者交换,不断重复这个过程。

假如不需要交换次数最少,有种更简洁的写法,即两次for循环,第一个for循环将非零元素放在数组前面,第二次for循环将非零元素放在数组后面。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int pZero = findNextZeroIndex(nums, -1);

int pNonZero = findNextNonZeroIndex(nums, pZero);

while (pZero < nums.size() && pNonZero < nums.size()) {
swap(nums[pNonZero], nums[pZero]);
pZero = findNextZeroIndex(nums, pZero);
pNonZero = findNextNonZeroIndex(nums, pZero);
}
}
int findNextZeroIndex(vector<int> &nums, int pZero) {
pZero++;
while (pZero < nums.size() && nums[pZero] != 0) {
pZero++;
}
return pZero;
}
int findNextNonZeroIndex(vector<int> &nums, int pNonZero) {
pNonZero++;
while (pNonZero < nums.size() && nums[pNonZero] == 0) {
pNonZero++;
}
return pNonZero;
}
};