許博淳
數據共筆
Published in
Jul 9, 2023

題目連結: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)