题目:
思路:
原数组和结果数组的变化:0往左移,非零往右移。
如果能一次移动到位,则时间复杂度低。
对数组从左到右遍历,用一个变量zeros动态记录下标为i的元素左边的零的个数,每次把下标为i的元素覆盖下标为i - zeros的元素,最后给末尾zeros个元素全赋值为0。
代码:
class Solution {
public void moveZeroes(int[] nums) {
int zeros = 0;
/**
* zeros记录左侧0数,下标为i的元素左侧有zeros个0时,该元素最后的位置为i - zeros(左移zeros位)
*/
for(int i = 0; i < nums.length; i++) {
if(nums[i] == 0) {
zeros ++;
continue;
}
nums[i - zeros] = nums[i];
}
for(int i = 0; i < zeros; i++) {
nums[nums.length - 1 - i] = 0;
}
}
}