找出数组中出现了奇数次的两个数
题目描述
一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数
题目思路:
思路:对数组所有的数进行异或运算,偶数个数的数异或结果为0,将这两个要找的数标记为A、B,也就是最终结果为A、B异或的结果,此时取出右边第一个1,A、B在此位置的值不相同,一个为1,另一个为0,根据这个特点将这些数据分为两两组,分别异或.
图示:
代码:
package com.courage.algorithm;
/*
一个数组中有两种数出现了奇数次,
其他数都出现了偶数次,怎么找到并打印这两种数
*
*/
public class FindTwoNumber {
public static void main(String[] args) {
int [] arr = {1,1,2,2,3,3,4,4,5,6,6,7,8,8,9,9};
findTwoNumber(arr);
}
/*
* 思路:对数组所有的数进行异或运算,偶数个数的数异或结果为0,将这两个要找的数标记为A、B
* 也就是最终结果为A、B异或,此时取出右边第一个1,A、B再此位置的值不相同,一个为1,
* 另一个为0,根据这个特点将这些数据分为两拨,分别异或.
*
* */
public static void findTwoNumber(int[] arr) {
int temp = 0;
for (int i = 0; i < arr.length; i++) {
temp ^= arr[i];
}
int markBite = findBit1RightNumber(temp);
int A = 0;
int B = 0;
for (int i = 0; i < arr.length; i++) {
if ((arr[i] & markBite) == markBite){
A ^= arr[i];
}else{
B ^= arr[i];
}
}
System.out.println("奇数个数的两个数分别为:"+A+"、"+B);
}
//找出所给数字右边第一个非零位
public static int findBit1RightNumber(int number) {
int temp = ~number;
temp += 1;
temp = number & temp;
return temp;
}
}