题目
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
题解
class Solution {
public void moveZeroes(int[] nums) {
int n = nums.length, left = 0, right = 0;
while (right < n) {
if (nums[right] != 0) {
swap(nums, left, right);
left++;
}
right++;
}
}
public void swap(int[] nums, int left, int right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
}
分析
数组最终形态是一串非0数字后跟一串0,且非0数字串的相对位置不变。为达目标,算法应该从前往后依次将非0数字移到前面合适的位置(紧接在“原数组中前面紧邻的非0数字”之后。由于要求O(N)的时间,只能是扫描一次,所以“紧接原数组中前面紧邻的非0数字之后”即“已经移动好的非0串的最后一位的后一位”),于是需要明确 “已经移动好的非0串的最后一位的后一位”在哪、当前需要确认位置的数字是谁,基于这两个点,考虑采用双指针。一开始左右指针指向数组起点,这时的左右指针满足其各自应有的性质。右指针(指向当前需要确认位置的数字)从前往后扫描一遍,一旦遇到非0数字就要与左指针(已经移动好的非0串的最后一位的后一位)指向的数组元素进行交换,并将左指针后移一位。
自己的不足
1.(⊙o⊙)…刷题少
2.C++中有现成swap()函数直接交换数组元素。