if nums[i]==nums[i+1]:
nums.pop(i+1)
return nums
print(removeduplicates([1,1,2]))
『』』我個笨蛋之前一直找不到問題在**
因為我在列表中做了動態的變化,我遍歷的是之前列表的總長度-1 , 在pop的第一次長度就已在變,所以會超出範圍~~`
其實不然, for的時候lens(nums)早就變化了。
~~刪除線格式~~
讓我來取個例子: 【1,1,2】
先按照錯誤**走一遍:
i in 0-1:
如果num==num[1];
num.pop(1)
如果num[1】==num[2] , 等一下 沒有索引2 了~~
前面這是錯誤的~~ 思考過程,如果有大佬可以瞅瞅,新手別看了,我怕帶壞你。。
#有的人強調說不要在迭代列表時更改列表(來自segmentfault)
這篇啟發來自思否, 請別說我抄襲例子。
上面的例子:
l = [1, 2, 3, 4, 4, 5]
for i, value in enumerate(l):
if value == 4:
l.pop(i)
這裡有個bug,當你在i==3時,第乙個4刪掉,但length為5不為六,pop(๑′ᴗ‵๑) 完之後第二個4的索引為3了,但遍歷繼續往前不再管第二個4,直接跳i==4也就是數字5.
可以看出當你迭代是做出改變列表的指示,其索引也在做改變,例如[1, 4, 2, 3, 4, 5],len為6。當1的4被刪掉,但這是的列表就位【1,2,3,4,5】,len為5。
這裡可以發現pop 和迭代不可連用 容易產生漏洞??(我不是很確定)
反正在迭代中用pop時,i並沒有改變,還是按照原來的走,但是上線改變了?所以導致並沒溢位錯誤報出。就根據這個第二個4沒有變來判定的。(參考來自debugmyself)
接下來我要換一種方法了,上面給我了一次教訓?(如果有大佬可以用這兩個結合的,麻煩教教我)。
但是逆遍歷可以使用pop(參照knife-)
def removeduplicates(nums):
for i in range(len(nums)-1,0,-1):
if nums[i]==nums[i-1]:
nums.pop(i)
return nums
print(removeduplicates([1,2,3,4,4,5]))~
『』-----------------------『』
新手刷題 70道力扣題
1.兩數之和 1 暴力解法 時間複雜度為n n n class solution def twosum self,nums list int target int list int for i in range 0,len nums for j in range i 1,len nums if nu...
力扣刷題之兩數相加
題目 給出兩個 非空 的鍊錶用來表示兩個非負的整數。其中,它們各自的位數是按照 逆序 的方式儲存的,並且它們的每個節點只能儲存 一位 數字。如果,我們將這兩個數相加起來,則會返回乙個新的鍊錶來表示它們的和。您可以假設除了數字 0 之外,這兩個數都不會以 0 開頭。示例 輸入 2 4 3 5 6 4 ...
力扣刷題之區域和檢索 陣列不可變
這個題屬於簡單型別,這裡主要是記錄一種思路。第一反應是迴圈求取陣列中i到j元素的和,當然第一反應得到的答案通常都不是最優解法。這裡記錄另一種思路,字首和 先計算陣列 nums 在下標 j 和下標 i 1 的字首和,然後計算兩個字首和的差。其中求和不是利用雙層for迴圈 如果是這樣,那就可以直接for...