小李飛刀:python我來做題啦
好久不見
最近都在忙年底的年會,還沉迷於學習統計學,python教程還停留在基礎語法。
但是仔細規劃了下,還是要好好的瞄準目標前行。
所以準備呢,實戰走起來。
做題做題
無論如何,資料結構還是很重要的,所以準備每天刷leetcode的題目啦。
慢慢的恢復資料結構知識,也實際的寫一寫python。
第一題
27.移除元素
給定一個數組 nums 和一個值 val,你需要原地移除所有數值等於 val 的元素,返回移除後陣列的新長度。
不要使用額外的陣列空間,你必須在原地修改輸入陣列並在使用 O(1) 額外空間的條件下完成。
元素的順序可以改變。你不需要考慮陣列中超出新長度後面的元素。
class Solution: def removeElement(self, nums, val): """ :type nums: List[int] :type val: int :rtype: int """ for i in nums: if i == val: nums.remove(i) print(len(nums)) #這是第一版本的解法
但是測試出錯了
末尾的2沒有消除,陣列中間的2是消除了的。為什麼最後一個2會被錯過呢。
不死心的又測試了下,果然是最後一個值會被錯過。
class Solution: def removeElement(self, nums, val): """ :type nums: List[int] :type val: int :rtype: int """ length = len(nums) for i in range(length) if nums[i] == val: nums.remove(i) print(len(nums)) #隨手改了改
這個版本也是通過for in 迴圈,根據下標進行查詢,但是有個弊端,可能會越界。因為陣列移除之後會變短,但是length沒有更改。
所以還是原來的根據nums直接for in更便捷,所以我們來找找為什麼最後一個數值會被跳過吧~
搜尋了下發現有答案 python:在for遍歷list時使用remove出現的問題以及解析
因為remove刪除元素後,指標陣列所有數字前移,但是指標正常後移,所以,當到達最後一個數值的時候,指標早就不指向它了。
既然知道了原因,我們來想想怎麼解決這個問題吧!發現了個解決方案 慎用python的pop和remove方法
看來要慎用remove呢
新方法來啦~
class Solution: def removeElement(self, nums, val): """ :type nums: List[int] :type val: int :rtype: int """ for i in nums[:]: if i == val: nums.remove(i) print(len(nums))
這是因為x[:]與x不是同一個list,相當與把x的記憶體拷貝到一塊新的記憶體,當對x做remove操作的時候,新的記憶體list並沒有受影響。
然後成功提交啦,這是一個新的開始~開心
用4行解決了一道題~python你真棒!