题目
给定一个数组arr,其中只有一个数出现了奇数次,其他数都出现了偶数次,打印这个数。
进阶问题
有两个数出现了奇数次,其他数出现了偶数次,打印这两个数。
要求
时间复杂度O(N),空间复杂度(1)。
基本思路
整数n与0异或的结果是n,整数n与整数n异或的结果是0;同时,异或满足交换律和结合律。
知道上述的内容,解决这道题就很容易了。如果n出现了偶数次,那么,所有的n异或完后一定为0;如果n出现了奇数次,那么所有的n异或完后一定为n。即使数组中同一个数不是连着出现的,根据异或的交换律和结合律,我们知道,数组中顺序的改变不会影响结果。所以,这道题的步骤就是:先申请一个整型变量记为e,初始化为0,让e去和数组中每一个元素进行异或,最终的e就是答案
public void printOddTimesNum1(int[] arr){
int eO = 0;
for (int cur :arr){
eO ^= cur;
}
System.out.println(eO);
}
进阶问题
public static void printOddTimesNum2(int[] arr){
int eO = 0, eOhasOne = 0;
for(int curNum:arr){
eO ^= curNum;
}
int rightOne = eO & (~eO + 1);
for(int cur : arr){
if ((cur & rightOne)!=0){
eOhasOne^=cur;
}
}
System.out.println(eOhasOne + " " + (eO ^ eOhasOne))
}