小李飛刀:用python刷題ing....
叨逼叨
預設每天都要刷兩道題。
今天目標已完成。
第一題
26. 刪除排序陣列中的重複項
難度:簡單
型別:陣列
給定一個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素只出現一次,返回移除後陣列的新長度。
這題其實我之前做過,但是一直提交失敗。
經過昨天的那題陣列題,我換了一種for in方式。
之前我採用的是下標來定位,用 pop
來刪除重複項。
這次採用了陣列內的每一項來單獨做對比,用 remove
來進行刪除操作。
class Solution(object): def removeDuplicates(self, nums): """ :type nums: List[int] :rtype: int """ length = len(nums) if length > 1: \\這個判定很重要 point = nums[0] for i in nums[1:]: if point != i: point = i else: nums.remove(i) print(len(nums))
其中的 if length > 1 是後面進行修改的,是必須的判定。
因為可能存在空陣列的情況,那麼length = 0,不需要刪除任何專案。
而當只有一個數組的時候,length = 1,同樣不需要刪除任何專案。
看了下用時,800ms屬於中間位置。
看了下44ms的範例,採用的是下標標記,用了反向的思路。
因為是有序陣列,採用了快慢兩種指標,當存在不一致的時候,可以進行覆蓋,達到刪除的目的。
第二題
80. 刪除排序陣列中的重複項 II
難度:中等
型別:陣列
給定一個排序陣列,你需要在原地刪除重複出現的元素,使得每個元素最多出現兩次,返回移除後陣列的新長度。
和第一題十分相似,但是多了條件,就是數值可以出現兩次,這就需要額外的進行計數。
class Solution: def removeDuplicates(self, nums): """ :type nums: List[int] :rtype: int """ if len(nums) < 1: return 0 point = nums[0] count = 0 for i in nums[1:]: if point != i: point = i count = 0 else: count = count + 1 if count == 2: nums.remove(i) count = 1 return len(nums)
我的思路都是比較粗暴的辦法,就是用變數記錄當前的對比值,當對比值出現超出2次時候,就進行remove,和第一題比較接近的思路,方法也大致相同。
這題的用時會更少一點,但是也是中間位置。
總結
這兩天做的題目都比較相似,而且難度較低,都是陣列的題目。
套路比較相似,對python3的刪除操作和遍歷也有了更深的認識與實踐。
後續要開始做更多其他資料結構的題目,不斷嘗試。