双指针,类似弗洛伊德算法的办法,依次向后递推,每次快指针遇到不为0的
数就覆盖慢指针指向的下标,当快指针指向末尾,非0数就没有了,这个时候再
将慢指针截至末尾的数全部用0覆盖即可。这里在做了一点优化,利用for循环自身
的属性替代了快指针,我们只用维护一个慢指针就行了。
时间O(n),空间O(1)
public void moveZeroes(int[] nums) { int index=0; for(int num:nums) {
// 找出每一个非0的数,依次填入原数组中 if (num!=0){ nums[index++]=num; } }
// 扫描完全部非0数,那么后面的则必然全部是0了,直接覆盖 while (index<nums.length){ nums[index++]=0; } }