题目描述
一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
思路:位图解决。
import java.util.Arrays;
//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
public void FindNumsAppearOnce(int[] array, int num1[], int num2[]) {
if(array.length<2){
return ;
}
int[][] result = getBitMap(array);
num1[0] = result[0][0];
num2[0] = result[1][0];
}
public int[][] getBitMap(int[] array) {
int len = array.length;
int max = getMax(array);
//确定位图数组长度
int n = (max%32 == 0) ? max/32 :(max/32+1) ;
int[] bitmap = new int[n];
int index = 0;
int pad = 0;
for (int i = 0; i < len; i++) {
index = array[i] / 32;
pad = array[i] % 32;
bitmap[index] = bitmap[index] ^ (1 << pad);
}
int pos = 0;
int[][] a = new int[2][1];
for (int j = 0; j < n; j++) {
if (bitmap[j] != 0) {
String s = Integer.toBinaryString(bitmap[j]);
int s_len = s.length();
for (int k = 0; k < s_len; k++) {
if (s.charAt(s_len-k-1) == '1') {
a[pos][0] = j*32 + k;
pos++;
}
if (pos == 2) {
return a;
}
}
}
}
return a;
}
public int getMax(int[] array) {
int max = array[0];
int len = array.length;
for (int i = 0; i < len; i++) {
if (array[i] > max) {
max = array[i];
}
}
return max;
}
}