LeetCode.136
问提描述
数组中的字符只有一个字符出现次数是奇数次,其他字符出现次数都是偶数次;
想办法找出出现偶数次的那个函数;
要求:时间复杂度为线性增加;不额外增加空间;
可想到的方法:
- 暴力遍历两次,时间复杂度o(n^2);
- 使用字典存储每个值的数量,返回数量为奇数的值,时间复杂度o(n^2), 空间复杂度o(n);
- 使用异或的方法,因为异或运算具有交换律 “a异或b异或c” 等价于 “a异或c异或b”,把数组所有的元素进行异或运算,最后剩下的元素为奇数数量的元素;该方法满足时间复杂度为o(n^2),没有使用额外的空间;
简单介绍异或运算
异或运算是用于二进制计算的,二进制每一位上相等为0,相异为1。例如:2异或3,使用二进制表示:0010 异或 0011 得到 0001 即 1,所以2^3 = 1。
方法实现
input0 = [2,2,1] # out: 1
input1 = [4,1,2,1,2] # out:^ 4
def single_number(input_):
a = input_[0]
if input_.__len__()>1: # 记住判断数组长度,确定边界;
for i in range(1,input_.__len__()):
a = a ^ input_[i]
else: return a
return a
single_number(input0)
1
single_number(input1)
4