一个整型数组里除了两个数字之外,其他数字都出现了两次。请找出这两个只出现一次的数字。要求时间复杂度O(n),空间复杂度O(1)
我们知道如果把题目中的两个数字换成一个的话,整个数组内的元素连续异或,最终的数便是那个出现一次的数,因为异或的性质:相同为0,不同为1,所以有任何数字异或自己都是0。
换成两个数字后,我们可以继续全局异或,得到的数必然不等于0,那么也就是说二进制中必然有一位是1,比如是第K位为1,那么按照所有元素的第K位是否为1划分成两个子区间,这样,我们在这两个子区间内按照第一次的方法求解即可。
public static void getTwotimeNumber(int [] num) { if(num == null || num.length < 0) return ; int sum = num[0]; for(int i=1;i<num.length ;i++) sum = sum^num[i]; String sumBin = Integer.toBinaryString(sum); //获取最终和的二进制 int index = sumBin.length()-sumBin.lastIndexOf("1")-1; //判断最后一位二进制的下标 // System.out.println(index); int result1 = 0; int result2 = 0; for(int i = 0;i<num.length ;i++) { if(((num[i]>>index) & 1) ==1) result1 ^= num[i]; else result2 ^= num[i]; } System.out.println(result1+"...."+result2); }
版权声明:本文为博主原创文章,转载请注明出处。
原文地址:http://blog.csdn.net/u014307117/article/details/47843703