[面试] 删除多余的数组内容

上午做了个笔试,要求解一道in-place删除数组多余内容的算法题,有O(1)的额外空间要求。

完整的描述忘记了。大致的需求如下:

假设有一个有序数组nums = [1, 1, 1, 2, 3, 5, 5, 5],如果数组中的数字出现超过2次,则删除多余的数字。返回删除后的数组长度。

如 nums = [1, 1, 1, 2, 3, 5, 5, 5] 的结果应为nums = [1, 1, 2, 3, 5, 5], 并返回长度6.

 

虽然没涉及到复杂的结构或逻辑,不过要bare hand写一个bug free的算法还是难到我了。

刚刚凭记忆把卷子上写的代码在电脑上敲了一遍,果然没有通过....

下面是调试通过的代码,不保证是best practice或最简洁,但感觉应该满足题目的要求。时间复杂度不可避免的O(n)了。

def func(a):
    index = -1 # 有效下标记录
    count = 0
    temp = a[0]
    for i in range(len(a)):
        if temp == a[i]:
            count += 1
        else:
            temp = a[i]
            count = 1

        if count <= 2:
            index += 1
            a[index] = a[i]

    a = a[:index+1]
    return index + 1

if __name__ == '__main__':
    a = [1,1,1,2,3,4,4,4,5,9,9]
    length = func(a)
    a = a[:length] # 尴尬的引用传参,函数外需要额外截断
    print(a)
    print(length)
posted @ 2019-04-20 14:41  oDoraemon  阅读(439)  评论(0编辑  收藏  举报