题目一:数组中只出现一次的两个数字 :除了两个数字只出现过一次,其他都出现两次;要求时间复杂度n 空间复杂度1
方法:由于其他出现两次,所以异或的结果是两个只出现过一次数字的异或结果,结果肯定不为0;那么结果用二进制表示中的第一个‘1’的位置,对数组进行分类,该位置为1的和0的,分为两个数组,此时 这两个数组分别 求只出现过一次的那个数就可以的出了;
static void FindNumsAppearOnce(int []date) {
if(date==null||date.length<2)
return ;
int re=0;//全部异或的结果
for(int i=0;i<date.length;i++)
re^=date[i];
//寻找结果中第一位为1的位置
int indexof=0;
while(re!=0) {
if((re&1)==1)
break;
indexof++;
re>>=1;
}
re=1<<indexof;
//根据这个位置进行分组异或
int num1=0,num2=0;
for(int i=0;i<date.length;i++) {
if((date[i]&re)==0)
num1^=date[i];
else
num2^=date[i];
}
System.out.println(num1);
System.out.println(num2);
}
题目二:数组中唯一出现过一次的数字,其他数字出现过三次
方法:创建32的数组,把每一一个数字用二进制表示,加到相对应的数组中;如果数组的值能被三整除,那么就表示要找那个数字对应的那一位是0,否则是1
static void FindOnlyOne(int[] array) {
if(array==null||array.length<1)
return ;
int []B=new int [32];
for(int i=0;i<array.length;i++) {
int bitMask=1;
for(int j=31;j>=0;j--) {
int bit=array[i]&bitMask;
if(bit!=0)
B[j]++;
bitMask<<=1;
}
}
int result=0;
for(int i=0;i<32;i++) {
result<<=1;
result+=B[i]%3;
}
System.out.println(result);
}
来源:https://www.cnblogs.com/niliuxiaocheng/p/12593355.html