一個題目,長度爲n的順序表L中刪除所有值爲X的數據元素,要求時間複雜度爲,空間複雜度爲。
思路:用兩個數i,j,i表示當前數組中所在的位置,j用於遍歷數組,如果j的值不爲X,則加入到數組中,如果值爲X,則繼續遍歷,捨棄該數據。
下面是python代碼
def delX(a, x):
i = 0
j = 0
while(i < len(a) and j < len(a)):
if(a[j] != x):
a[i] = a[j]
i += 1
j +=1
print(id(a))
#a = a[:i] #不能這麼計算了,a已經被修改,同時修改的是局部變量,不能通過參數返回
del a[i:] #可以使用下面的del進行刪除
print(id(a))
if __name__ == "__main__":
a = [1, 2,3,5,2,6,3,6,78,9]
print("org:",a, len(a), id(a))
delX(a,2)
print("del:",a, len(a), id(a))
a = a[:7]
print("test:", a, len(a), id(a))
a.remove(1)
print("remove:", a, len(a), id(a))
a.pop(4)
print("pop:", a, len(a), id(a))
運行上面的代碼,得到的輸出:
org: [1, 2, 3, 5, 2, 6, 3, 6, 78, 9] 10 4356218696
4356218696
4356218696
del: [1, 3, 5, 6, 3, 6, 78, 9] 8 4356218696
test: [1, 3, 5, 6, 3, 6, 78] 7 4356218760
remove: [3, 5, 6, 3, 6, 78] 6 4356218760
pop: [3, 5, 6, 3, 78] 5 4356218760
可以看到如果採用賦值的方式,上面list的地址空間將會改變。
所以刪除list中的元素不能使用賦值的方式,而是應該採用del
、remove
、pop
這樣的方式。
del
、remove
、pop
的區別是:
del
可以進行slice的操作,同時不會改變地址空間,比較方便remove(X)
將移除第一次出現X的值,注意:如果元素多次出現,只能移除第一次出現的元素,其他元素還在list中pop(X)
將在list中移除list[X]的值