zoukankan      html  css  js  c++  java
  • [面试] 删除多余的数组内容

    上午做了个笔试,要求解一道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)
  • 相关阅读:
    AFHTTPRequestOperationManager的那些事
    iOS缩放图片
    iOS截图
    网络服务
    Six
    正文处理命令及tar命令
    用户,群组和权限 四
    用户,群组和权限 三
    用户,群组和权限 二
    用户,群组和权限 一
  • 原文地址:https://www.cnblogs.com/oDoraemon/p/10740905.html
Copyright © 2011-2022 走看看