一个面试题。其实算脑筋急转弯。
我觉得甚至都不能说是智力题。这种题目纯看经验,自己做过类似的,就有印象,就能往这个方面去想。人和人的思维方式都不一样,不一定我就能想到你希望我能想到的。
快速查找数组中出现奇数次的数字
def findOdd(nums):
result = 0
for num in nums:
result ^= num
return result
主要用到了异或的三条性质
- 任何数和0做异或运算,结果仍然是原来的数,即
a ^ 0 = a
。 - 任何数和其自身做异或运算,结果是0,即
a ^ a = 0
。 - 异或运算满足交换律和结合律,即
a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b
。
可以举个例子理解一下代码执行过程
例如针对 2,2,2,1,2,1,1
首先:result = 0 ,0^2 =2;
之后:
2^2 = 0;
0^2 = 2;
2^1 = (2^1);
(2^1)^2 = 1;
1 ^ 1 = 0;
0 ^ 1 =1;
结果就是1
还是很巧妙的。