1. 程式人生 > 實用技巧 >leetcode 283. 移動零

leetcode 283. 移動零


本題 題目連結

題目描述


我的題解

方法一:

思路分析

  • 慢指標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的位置,也無所畏懼了~
  • 迴圈結束之後呢,還有一個迴圈,這個迴圈是為了把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;
    }