落单的数1
题目描述:某一个数组里面只有一个数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);
}
//解析:所有出现偶数次的数据 都会在连续的异或之后消掉,只剩下出现奇数次的数据
落单的数2
题目描述:一个数组,只有一个数单独出现,其余的数字都出现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:要转的进制