题目描述
Given an integer array nums, move all 0’s to the end of it while maintaining the relative order of the non-zero elements.
Note that you must do this in-place without making a copy of the array.
样例描述
Example 1:
Input: nums = [0,1,0,3,12]
Output: [1,3,12,0,0]
Example 2:
Input: nums = [0]
Output: [0]
Constraints:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
思路
- 双指针的思路:一个指针
k
用来占位,留着放有效数字,另外一个指针往后遍历寻找非0的有效数字,找到以后就存到k
指向的位置。直到快的指针走到末尾时,就把k
后面的到末尾的位置补0即可 - 注意 不要用交换(一个找0一个找非0然后换),这样多此一举。 因为都已经知道其他是0,直接覆盖成0即可
代码
class Solution {
public void moveZeroes(int[] nums) {
int k = 0; //指向有效数的位置
for (int x: nums){
//寻找非0的有效数 然后放到前面的指针指的位置
if (x != 0){
nums[k ++] = x;
}
}
//有效数要是没满,其余位置补0
while (k < nums.length) nums[k ++] = 0;
}
}