给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
一开始我的想法是暴力枚举,python代码如下:
1 | for i in nums: |
后来一想,要求具有线性时间复杂度,对python的list.count()
不是很了解,万一这玩意本身的时间复杂度是O(n),然后一来不就O(n^n)了?
随后想到先把这个数组排个序,然后模拟栈来实现(需要使用2个int
的空间来存放结果)
1 | def func(nums): |
居然很神奇的过了,用时88ms,超过22.81%,内存14.8MB超过48.18%。不过这显然不符合题目要求
想不出办法了,看看题解里面,有个叫做Hash表
的算法,想到了在离散数学里面似乎看到过这玩意,就是比如[3,1,2,4,5]
这个数组,根据值来确定存放元素的地址,3就放在a[3]的位置(1开始算)
这样的话,python里面用dict就可以实现,暂且不表
最骚的是直接用XOR,XOR还能满足交换律?!长见识了,考虑到每个重复元素只出现2次,就tql
1 | def func(nums): |