leetcode 283. 移動零
阿新 • • 發佈:2020-07-31
題目描述
我的題解
方法一:
思路分析
- 慢指標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; }