(昨天肝大作业忘记写了,今天补上)
题目
给定一个整数数组,将其中的0都移到数组的末尾,其它数字保持原来的顺序
示例:
Input: [0,1,0,13,12]
Output: [1,13,12,0,0]
要求:in-place
我的思路
比较容易想到的就是双指针法,两个指针一个指向0,一个指向非0,从数组的第一个数开始,如果在一次循环中找到的0的位置在找到的非0位置之前,就交换两个数。
以题目示例来解释,指向0的指针为p1,指向非0的指针为p2。
首先p1指向0,p2指向1,由于p1在p2前,交换两数位置,继续向后寻找,p1指向0(index=1),p2指向13,发现p1在p2之前,交换两数位置……(以此类推)
代码如下:
class Solution {
public void moveZeroes(int[] nums) {
// two pointer
if (nums == null || nums.length == 0) {
return;
}
int pointToZero = 0, pointToNonZero = 0;
int n = nums.length;
while (pointToZero < n && pointToNonZero < n) {
while (pointToZero < n && nums[pointToZero] != 0) {
pointToZero++;
}
while (pointToNonZero < n && nums[pointToNonZero] == 0) {
pointToNonZero++;
}
if (pointToZero < n && pointToNonZero < n && pointToZero < pointToNonZero) {
// exchange
nums[pointToZero] = nums[pointToNonZero];
nums[pointToNonZero] = 0;
}
// pointToZero++;
pointToNonZero++;
}
}
}
这个解法需要注意的地方有两点:
- 判断两数是否需要交换位置时一定要看指向0的指针是否在指向非0的指针之前,如果不满足这个条件,其实意味着0本来就在后面,不需要交换
- 在进入下一次循环之前需要移动指针的位置,但只需要移动指向非0的指针,指向0的指针需要保持原位,因为这个0可能也需要被交换到后面去