1 题目描述
有一个非空整型数组,其中只存在一个只出现一次的数字,其它数字都出现两次,要求在线性时间复杂度下找出这个数字。
2 哈希查找法
这是一个python很好写但是很浪费空间的方法,思想在于遍历所有数字,如果该数字在之前没有出现,那就以其为key,将其添加到字典中;若是已经出现,那就在字典中把这个key删除,最后字典中只会存在一个key,就是没有出现过的那个数字。
class Solution:
def singleNumber(self, nums: List[int]) -> int:
pre_dict = {}
for num in nums:
if num in pre_dict:
del pre_dict[num]
else:
pre_dict[num] = num
return list(pre_dict.keys())[0]
时间复杂度为 O ( n ) O(n) O(n),空间复杂度较高。
3 按位异或运算法
按位异或⊕(eor)操作的定义如下:
比较两个数值每一位的二进制码,如果某一位相同,则置0,否则置1。
异或以下性质:
异或运算有以下三个性质。
任何数和 00 做异或运算,结果仍然是原来的数,即 a ⊕ 0=a。
任何数和其自身做异或运算,结果是 0,即 a ⊕ a=0。
异或运算满足交换律和结合律,即 a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b。
因此,只需要把所有的元素进行异或运算,最终得到的结果就是数组中只出现一次的值,因为出现两次的值在进行异或运算之后都变成0了。
思想非常巧妙,这一题考察的就是对按位异或操作的理解,要记住异或的定义。
class Solution:
def singleNumber(self, nums: List[int]) -> int:
out = 0
for num in nums:
out = out ^ num
return out