一道Python面试题

看到Hey!Linux张贴出的一道面试题

我感觉性能多耗在排序和列表内元素两两比较上,我想了另一种思路:源列表生成一个集合,源列表和新集合各项元素总和的差就是重复的那个数,代码如下:

#!/usr/bin/env python3
arr1 = [i for i in range(1,1000000)]+[500000]  
arr4 = set(arr1)  
print(sum(arr1)-sum(arr4))  

代码略简洁,那性能是不是也会更好呢?为了明显比较两种算法性能,我将列表范围扩大到1~1000000,并将重复值设在中位数500000,将他的算法重写如下:

#!/usr/bin/env python3
arr1 = [i for i in range(1,1000000)]+[500000]  
arr4 = sorted(arr1)  
i = len(arr4) - 1  
for x in range(i):  
    y = x + 1
    if arr4[x] == arr4[y]:
        print(arr4[x])

分别测试,结果分别为0.53s和0.70s,我的算总和再相减的方法略快点,不过也不一定,看情况:
当重复值在出现在列表前几个元素,则列表内两两元素比较算法快,因为只需比较前几个元素就结束;但当重复值越往后,列表内两两元素比较的方法相应就更慢了~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,473评论 25 709
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,525评论 18 399
  • 教你如何迅速秒杀掉:99%的海量数据处理面试题 本文经过大量细致的优化后,收录于我的新书《编程之法》第六章中,新书...
    Helen_Cat阅读 12,129评论 1 39
  • 进口汽车可以先放在保税区,不需要立刻交关税,只需要缴纳贮存费。在需要售卖的时候,再过关上税。
    Natnel阅读 1,292评论 0 0
  • 30总是一个特殊的数字,孔夫子的 “30而立” 不知道误导了多少人,让当下的年轻人一毕业就考虑着要在30岁前创功立...
    彩虹门票阅读 3,635评论 0 2

友情链接更多精彩内容