题目内容
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
题目解析,思路及解法
根据题目,我们可以使用双指针的方式如下:
- 左指针left指向已经处理好序列的尾部,右指针right指向未处理序列的头部。
- 右指针不断的向右移动,遇到非0的元素,就和左指针所指向的元素进行值交换,同时左指针右移。
注意以下性质:
1、左指针左边所对应的数均为非0数。
2、右指针的左边向左一直到左指针对应的数都为0。
因此每次交换,都是当右指针发现了非0的数,和左指针对应的0进行交换。
代码实现
class Solution {
public void moveZeroes(int[] nums) {
if(nums==null) {
return;
}
int len = nums.length;
int left = 0,right = 0;
while(right < len) {
if(nums[right] != 0) {
swap(nums,left,right);
left++;
}
right++;
}
}
private void swap(int[] nums,int left, int right) {
int swap = nums[left];
nums[left] = nums[right];
nums[right] = swap;
}
}