数组中只出现一次的数字

来源:互联网 发布:h5响应式企业网站源码 编辑:程序博客网 时间:2024/05/01 18:09

题目:

一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现一次的数字。要求时间复杂度为o(n),空间复杂度为o(1).

例如:{2,4,3,6,2,3,5,5},输出4、6

首先若是只存在一个出现一次的数字,找出此数字,就是通过异或。

若是存在两个,解决思路:将这两个不同的数字分在不同的两个组中,每个组只存在一个出现一次的数字。

分组方法:1、全部异或,然后找到结果中最右边第一个不为0的位置index。

2、以index为分组标准,index位置为1的为一组,为0的为一组,这样相同的数字被分到相同的组,不同的数字就分到了不同的组。

3、分别对每个组的数字异或,最后得到的异或结果就是要找的两个数字

代码:

public class main {
public static void main(String[] args)
{
     int[] a = {2,4,3,6,3,2,5,5};
     int[] result = FindNumberOnce(a);
     System.out.println(result[0] + "/" + result[1]);
}

static int[] FindNumberOnce(int[] number)
{
int[] result = new int[2];
result[0] = 0;
result[1] = 0;

int tmp = 0;
for(int i = 0; i < number.length; i++)
tmp ^= number[i];
int index = finde1index(tmp);

for(int j = 0; j < number.length; j++)
{
if(isBit1(number[j], index))
result[0] ^= number[j];
else
result[1] ^= number[j];
}
return result;
}

static int finde1index(int data)
{
int index = 0;
while(((data & 1) == 0) && index < 32)
{
data >>= 1;
index++;
}
return index;
}
static boolean isBit1(int data, int index)
{
data = data >> index;
if((data & 1) == 1)
return true;
else 
return false;

}
 
}

0 0