题目描述:某一个数组里面只有一个数K出现了一次,其余的都出现了2次,找出这个数。
public static void main(String[] args) { int[] a=new int[]{1,1,2,2,3,3,4,4,5,5,6,7,7,8,8,9,9,0,0}; int x=0; for(int i=0;i<a.length;i++){ x=x^a[i]; } System.out.println(x); } //解析:所有出现偶数次的数据 都会在连续的异或之后消掉,只剩下出现奇数次的数据题目描述:一个数组,只有一个数单独出现,其余的数字都出现k次 如:222 444 777 8 000 333。 此时 k=3
public static void main(String[] args) { int k=3; int[] a=new int[]{2,2,2,4,4,4,7,7,7,8,0,0,0,3,3,3}; int len=a.length; char[][] ch=new char[len][]; int maxLen=0; //将每一个数字转换成k进制字符数组 for(int i=0;i<a.length;i++){ //求每一个数字的k进制字符串并翻转 :122--》221为了不进位加法时低位能够对齐 ch[i]=new StringBuilder(Integer.toString(a[i],k)).reverse().toString().toCharArray(); if(ch[i].length>maxLen){ maxLen=ch[i].length; //获取最大的字符串长度 } } int[] resArr=new int[maxLen]; for (int i = 0; i <len ; i++) { //不进位加法 for (int j = 0; j <maxLen ; j++) { if(j>=ch[i].length){ resArr[j]+=0; //不够的位数补0 }else { resArr[j]+=(ch[i][j]-'0'); } } } int res=0; //还原成10进制 for (int i = 0; i <maxLen ; i++) { res+=(resArr[i]%k)*(int)Math.pow(k,i); } System.out.println(res); } //解析:2个2进制的数做不进位加法:结果为0 //10个10进制的数做不进位加:结果为0 //k个k禁止的数做不进位加法,结果为0 // 解题思路 :将所有的数转换成k进制,然后进行不进位的加法,最后剩余的那个数就是单独的那个数,在转成10进制 //Java中的进制转换:Integer.toString(i,radix);args1:要转的数据 args2:要转的进制