算法学习一:给定一个数组,其中一个数出现了奇数次,其他出现了偶数次,求奇数次的数
解答该题需要运用到异或(^)的操作。具体代码如下(java代码为例):
public static void main(String[] args) {
//给定一个int型数组:里面只出现奇数次的数为 4 ,其他均出现了偶数次
int[] arrayInt = new int[]{1,1,2,2,3,3,4,5,5,6,6};
//解答该题,非常简单。
//什么是异或? 相同为0,不同为1,定义一个默认值,挨个与数组每个值去进行异或操作。那么,
//自然,出现偶数次的数,异或后全部是0,到最后得到的结果就是出现奇数的那个数字
int eor = 0;
for (int i: arrayInt
) {
eor ^= i;
}
System.out.println(eor );
}
输出结果为:4
扩展一:给定一个数组,有2个数出现了奇数次,其他出现了偶数次,求奇数次的2个数分别是多少?
解答该题同样用到异或
具体解法如下(java为例):
public static void main(String[] args) {
//给定一个int型数组:里面只出现奇数次的数为 4和 185 ,其他均出现了偶数次
int[] arrayInt = new int[]{1,1,2,2,3,3,4,5,5,6,6,185,199,199,75,75};
int eor = 0;
for (int i: arrayInt
) {
eor ^= i;
}
//eor = a^b
//eor !=0,因为有俩个出现奇数次的数,所以eor异或后,肯定不为0
//eor必然有一个位置上是1
int rightOne = eor & (~eor + 1);//提取出最右的1(**把某个不为0的数,最右侧的1提取出来**)
int onlyOne = 0;
for(int cur : arrayInt){
if((cur & rightOne) == 1){
onlyOne ^= cur;
}
}
System.out.println(onlyOne+" "+(eor ^ onlyOne));
}
输出结果为 185 4