leetcode中的題目,感覺之前不太理解,就記錄下來了。
題目:移動零,給定一個數組 nums, 編寫一個函數將所有 0 移動到它的末尾,同時保持非零元素的相對順序(Python3 環境)。
例如:
- 必須在原數組上操作,不要為一個新數組分配額外空間。
- 盡量減少操作總數
1、在編寫程序過程中,首先想到了remove函數:
class Solution(object): def moveZeroes(self, nums): for i in range(len(nums)): if nums[i]==0: nums.remove(nums[i]) nums.append(0) return nums A=Solution() print(A.moveZeroes([1,0,0,3]))
結果是對的[1,3,0,0]
2、后面又想到了del函數
class Solution(object): def moveZeroes(self, nums): for i in range(len(nums)): if nums[i]==0: del (nums[i]) nums.append(0) return nums A=Solution() print(A.moveZeroes([1,0,0,3]))
結果是錯誤的:[1,0,3,0]
3、之前沒有深究過這兩個函數的區別,在這突然想深究一下。
按我們的正常思維考慮一下上面兩個程序,給定列表nums=[1,0,0,3],在for循環中,當i=0時,不作處理;
當i=1時,此時nums[1]=0,刪除nums[1]=0,然后在末尾再添加一個0 ,nums變為nums=[1,0,3,0];
當i=2時,此時nums[2]=3,不作任何處理;
當i=3時,此時nums[3]=0,刪除nums[3]=0,然后在末尾再添加一個0 ,nums變為nums=[1,0,3,0];
由此可以看出,我們所考慮的最后結果和del函數的處理是一樣的,那么remove函數為什么不一樣呢?
原因是:
(1)remove刪除的是首次出現在列表中的元素。在第一個程序中,當i=3時,nums=[1,0,3,0],nums[3]=0,
當執行這一句 nums.remove(nums[3]) 操作時,會首先找到列表中第一次出現的0,將其刪掉。
(2)而del刪除的就是那個索引的元素。在第二個程序中,當i=3時,nums=[1,0,3,0],nums[3]=0,
當執行這一句 nums.remove(nums[3]) 操作時,會將nums[3]在索引3這個位置的元素刪掉。
4、對於第二個程序的調試:
class Solution(object): def moveZeroes(self, nums): index=0 for i in range(len(nums)): if nums[index]==0: del (nums[index]) nums.append(0) else: index+=1 return nums A=Solution() print(A.moveZeroes([1,0,0,3]))
注意:i只是對操作次數的循環,在循環中完全可以不用。
