异或(^)的一个很重要的性质是: a ^ a = 0 a ^ 0 = a
下面总结几道运用到其性质的题目。
例1:有两个整型乱序数组,其中一个数组比另外一个多一个数字,其他数字都一样,让你求出这两个数组相差的那个数字。(要求时间复杂度为O(N))。
思路:先分别求两个数组的异或,然后再将两个数组的异或结果再进行异或,最终结果就是答案。
代码:
int diffNumofTwoArr(vector<int> num1, vector<int> num2)
{
int m1 = 0, m2 = 0;
for (auto i : num1)
m1 ^= i;
for (auto j : num2)
m2 ^= j;
return m1 ^ m2;
}
google面试题的变形:一个数组存放若干整数,一个数出现奇数次,其余数均出现偶数次,找出这个出现奇数次的数?
奇数个异或是本身,偶数个是0;0^a=a;异或有交换律