本题 题目链接
题目描述
我的题解
方法一:
思路分析
- 慢指针cur记录当前可以被覆盖的位置,快指针i从头到尾遍历数组:
- 当nums[i]!=0的时候,用i位置的元素覆盖cur位置的元素,然后i++,cur++。
- 若nums[i]=0,只有i++.
- 并不会造成值的丢失:
- 第一次循环的时候,若nums[i]非零,此时执行nums[cur] = nums[i],i 与 cur 的值一致,并不会造成数据的丢失。
此后i++,cur++,然后进入第二次循环,在遇到值为0的元素之前,i与cur的值一直保持一致。 - 当第一次遇到值为 0 的时候,只有i执行了加一操作,此时,cur与i已经不相等了,而cur指向的刚好就是这个值为0的位置(因为在之前cur有+1呀)。
继续执行循环,当遇到nums[i]非零时,nums[cur]=nums[i],此时nums[i]覆盖的值是0,无所谓~
而 i 这个位置的值也被记录下来了,哪怕后续cur指向了这个i的位置,也无所畏惧了~
- 第一次循环的时候,若nums[i]非零,此时执行nums[cur] = nums[i],i 与 cur 的值一致,并不会造成数据的丢失。
- 循环结束之后呢,还有一个循环,这个循环是为了把
cur
后面的元素都赋值为0(因为上一个循环中,i走在cur
前面,把非零元素的值都拿出来了,拿出来后,i 位置的值还留在那里 并没有被更换为0)
public void moveZeroes(int[] nums) {
if(nums == null) return ;
int cur = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
nums[cur++] = nums[i];
}
}
while (cur < nums.length)nums[cur++] = 0;
}