Cracking the Coding Interview-2.1

第六版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数据上操作的,并不符合题目的要求。为了达到题目的要求,需要的自己实现一个(单)链表以及最基本的链表插入和删除方法。关于链表的基本操作比较基本,在这里不阐述了。


在手机上阅读或分享本文请扫描以下二维码:
By @Zhengyi Yang in
Tags : #cracking the coding interview, #python, #linked list, #duplicates,

Comments

评论功能已关闭。