数组中只有一个数出现了1次,其他都出现了k次。请输出只出现1次的数。
不规则进制;进制并非只有2、8、10、16进制
2个相同的二进制数做不进位加法,结果为0
10个相同的十进制数做不进位加法,结果为0
k个相同的k进制数做不进位加法,结果为0
代码如下:
public class Main{
public static void main(String[] args) {
int[] arr={2,2,2,9,7,7,7,3,3,3,6,6,6,0,0,0};
char[][] kRadix=new char[arr.length][];
int k=3;
//转成k进制字符数组
int maxlen=0;
//对于每个数字
for (int i=0;i<arr.length;i++){
//求每个数字的k进制字符串并反转,然后转为字符数组
kRadix[i]=new StringBuilder(Integer.toString(arr[i],k)).reverse().toString().toCharArray();
if (kRadix[i].length>maxlen){
maxlen=kRadix[i].length;//因为有的数转换后最高位的0会被舍去
}
}
//存放做完不进位加法每一位和
int[] resArr=new int[maxlen];
for (int i=0;i<arr.length;i++){
//不进位加法 相当于计算机中的异或操作。正常加,只是进位舍掉就好了
//比如二进制不进位加法: 1+1 = 0, 1+0 = 1
for (int j=0;j<maxlen;j++){
if (j>=kRadix[i].length){
resArr[j]+=0;
}else {
resArr[j]+=(kRadix[i][j]-'0');
}
}
}
int res=0;
for (int i=0;i<maxlen;i++){
res=(resArr[i]%k)*(int)(Math.pow(k,i));//
//Math.pow(k,i);k是底数,i是次方。k的i次方
}
System.out.println(res);
}
}