新手菜鳥刷力扣之關於遍歷

2021-10-02 09:12:44 字數 1318 閱讀 8148

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...