问题描述
我正在使用 LeetCode 练习,但遇到了 this 问题。我只是在python中学习算法和数据结构,所以不太了解一些内置方法是如何实现的,所以我最初的尝试是(python代码)
return [num for num in Counter(nums) if Counter(nums)[num] == 1]
但是在 this testcase 上运行需要整个 12.82 秒。另一方面,讨论中有very similar one liner
return [c[0] for c in Counter(nums).items() if c[1] == 1]
使用相同的想法但运行速度更快,上述测试用例仅用了 0.0022 秒。为什么在运行时会有如此大的差异?
解决方法
此代码的问题:
return [num for num in Counter(nums) if Counter(nums)[num] == 1]
是对于num
中的每个Counter(nums)
,您必须创建一个新的Counter(nums)
来确定if
条件是真还是假。通过在第二个版本中使用 Counter(nums).items()
:
return [c[0] for c in Counter(nums).items() if c[1] == 1]
您已经可以访问该数字及其计数,因此无需重新计算每个数字的计数。
注意我会把理解写成
return [num for num,count in Counter(nums).items() if count == 1]
使其工作原理更加明显。