leetcode27之移除元素

題目描述:

給你一個數組 nums 和一個值 val,你需要 原地 移除所有數值等於 val 的元素,並返回移除後數組的新長度。

不要使用額外的數組空間,你必須僅使用 O(1) 額外空間並 原地 修改輸入數組。

元素的順序可以改變。你不需要考慮數組中超出新長度後面的元素。

 

示例 1:

給定 nums = [3,2,2,3], val = 3,

函數應該返回新的長度 2, 並且 nums 中的前兩個元素均為 2。

你不需要考慮數組中超出新長度後面的元素。

來源:力扣(LeetCode)
鏈接://leetcode-cn.com/problems/remove-element

程式碼實現:

 1 def removeitem(nums, tar):
 2     ans = 0
 3     for num in range(len(nums)):
 4         if nums[num] != tar:
 5             nums[ans] = nums[num]
 6             ans += 1
 7         else:
 8             continue
 9 
10     return ans
11 
12 
13 print("---------------測試removeitem()-------------")
14 nums = [3, 3, 3, 3, 3]
15 target = 2
16 res = removeitem(nums, target)
17 print("res=", res)
18 
19 
20 def removeitem1(nums, tar):
21     '''
22 
23     :param nums:
24     :param tar:
25     :return:
26     '''
27     for i in range(len(nums) - 1, -1, -1):
28         if (nums[i] == tar):
29             nums.pop(i)
30 
31     return len(nums)
32 
33 
34 print("---------------測試removeitem1()-------------")
35 nums = [3, 3, 3, 3, 3]
36 target = 2
37 res = removeitem1(nums, target)
38 print("res=", res)
39 
40 
41 def removeitem2(nums, tar):
42     '''
43 
44     :param nums:
45     :param tar:
46     :return:
47     '''
48     l=len(nums)
49     for i in range(l):
50         if (nums[i] != tar):
51             nums.append(nums[i])
52             # nums.pop(i)
53     del nums[:l]
54     return len(nums)
55 
56 print("---------------測試removeitem2()-------------")
57 nums = [3, 3, 3, 3, 3]
58 target = 2
59 res = removeitem2(nums, target)
60 print("res=", res)

輸出:

---------------測試removeitem()-------------
res= 5
---------------測試removeitem1()-------------
res= 5
---------------測試removeitem2()-------------
res= 5

總結:1、原地移除元素,考慮使用雙指針。方法一正是採用了類似雙指針策略來實現。遍歷整個數組,若該元素與目標元素相等,跳過繼續循環,若不想等,執行nums[ans]=nums[num]操作,ans+=1。返回ans即為最終數組長度。

2、方法二思路很值得借鑒,考慮從數組末尾開始遍歷,如果相等,彈出該元素;如果不相等,繼續循環。返回為len(nums)

3、方法三追加元素+刪除數組方法。從頭開始遍曆數組,如果相等,跳過繼續循環;如果不等,在數組末尾追加該元素。循環結束後刪除原有長度數組,返回len(nums)。該方法依然滿足O(1)複雜度要求