一个题目,长度为n的顺序表L中删除所有值为X的数据元素,要求时间复杂度为 O ( n ) O(n) O(n),空间复杂度为 O ( 1 ) O(1) O(1)。
思路:用两个数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]的值