第六版Cracking the Coding Interview题目2.1,题目如下:
Remove Dups: Write code to remove duplicates from an unsorted linked list.
FOLLOW UP
How would you solve this problem if a temporary buffer is not allowed?
题目要求删除链表中重复的元素,虽然Python中的list
并不是一个链表,但如果将问题简化为使用list
,那么常见的做法如下:
def removeDuplicates(l):
return list(set(l))
上述方法直接将list
转换为set
,非常简洁并且运行速度很快,但也有几个缺点:1)无法在原有的列表上修改 2)无法保留原来的顺序。所以我们可以定义一个额外的buffer记录已经出现过的元素,并在遇到重复时直接在列表上删除该元素。时间和空间复杂度均为O(n),实现如下:
def removeDuplicates(l):
seen = set()
i = 0
while i < len(l):
if l[i] in seen:
del l[i]
else:
seen.add(l[i])
i += 1
return l
如果不允许额外使用buffer,则时间复杂度为O(n2),实现如下:
def removeDuplicates(l):
i = 0
while i < len(l):
j = i + 1
while j < len(l):
if l[j] == l[i]:
del l[j]
j += 1
i += 1
return l
以上方法都是在list
数据上操作的,并不符合题目的要求。为了达到题目的要求,需要的自己实现一个(单)链表以及最基本的链表插入和删除方法。关于链表的基本操作比较基本,在这里不阐述了。
在手机上阅读或分享本文请扫描以下二维码:
Comments