题目一:数组中只出现一次的两个数字 :除了两个数字只出现过一次,其他都出现两次;要求时间复杂度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