题目1
给定一个整数数组local,已知数组中只有一个数出现了奇数次,其他数都出现了偶数次,找出这个出现奇数次的数。
解析
此题用到异或的性质:n^n = 0;n^0 = n;并且异或操作满足交换律和结合律。
令e = 0,让e逐个对数组中的值做异或,最后结果值即为该出现奇数次的值.
如local = {A,B,C,A,B,N,C},令e ^ A^B^C^A^B^N^C = 0^(A^A)^(B^B)^(C^C)^N = N;
代码实现
class OddAppearance {
public:
int findOdd(vector<int> A, int n) {
// write code here
int e = 0;
for(int i = 0;i<n;i++){
e = e^A[i];
}
return e;
}
};
题目2
给定一个整数数组local,已知数组中只有两个数出现了奇数次, 其他数都出现了偶数次,找出出现奇数次的两个数,并按照从小到大的顺序返回。
解析
假设数组中两个出现奇数次的值为a和b,按照上题只有一个数出现奇数次的思路,令e = 0,让e逐个对数组中的值做异或,最后
e = a^b;
现在的问题是如何识别出a和b。
因为a和b不同,则e 必定不为0,那么e一定有一个位是1 ,并且这个位上a和b只有