題目連結:https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/
題意說明:
- 一串遞增的數字 list,nums,數字可能出現多次
- 任務一:找出所有不重複數字,依照順序排列在 nums的最前面
- 任務二:回傳有多少個不重複數字
初始想法
一開始我眼殘,沒有注意到數字已經遞增排列,所以意外找到了一個就算數字沒有遞增排列,還是可以依照先後順序排好輸出的方式。
用 sorted(, key=nums.index)就可以依照原本 nums的先後順序排列 nums中的數字
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
temp = sorted(set(nums), key=nums.index)
nums[:len(temp)] = temp
return len(temp)
缺點是這樣很慢,沒有好好利用數字已經遞增排列的條件
重新看題目之後,決定用迴圈一個一個替換,意外得快
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
count = 1
for i in range(len(nums)-1):
if nums[i] != nums[i+1]:
nums[count] = nums[i+1]
count = count+1
return count
既然是要找出不重複數字,且數字已經遞增排列,就會想到我們的老朋友 set
- 先用 set取出不重複數字
- 排序好,根據實測,set自動排序會把負數排在正數後
- 修改 nums
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
non_repetitive_nums = list(set(nums))
nums_output = sorted(non_repetitive_nums)
nums[:len(nums_output)] = nums_output
return len(nums_output)