题目
数组中只有一个数出现了一次,其他的数都出现了k次,请输出只出现了1次的数。
分析
例如2个二进制数10做不进位加法,结果为二进制00;10个十进制数20做不进位加法,结果为十进制0,由此可得上图规律,k个相同的k进制数做不进位加法,结果为0。故我们可以将所有的数转化成为K进制,然后做K进制的不进位加法,得出的结果再从K进制转换为10进制。
代码实现
public class _07出现k次与出现1次 {
public static void main(String[] args) {
int []arr = {2,2,2,9,7,7,7,3,3,3,6,6,6,0,0,0};
//创建一个二维字符数组,用来保存K进制位数
int len = arr.length;
char [][] kRadix = new char[len][];
int k = 3;
int maxLen = 0;
// 转成k进制字符数组
// 对于每个数字
for (int i = 0; i < len; i++) {
// 先求每个数字的三进制字符串,然后反转,转为字符数组
kRadix[i] = new StringBuilder(Integer.toString(arr[i],k)).reverse().toString().toCharArray();
//更新K进制数的最大位数
if (kRadix[i].length>maxLen) {
maxLen = kRadix[i].length;
}
}
int [] resArr = new int[maxLen];
// 进行不进位加法
for (int i = 0; i < len; i++) {
// 进行不进位加法
for (int j = 0; j < maxLen; j++) {
if (j>=kRadix[i].length) {
resArr[j] += 0;
}else {
// kRadix[i][j]-'0' 字符-'0' ,从字符转换成了数字
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));
}
System.out.println("数组中只出现了1次的数是:"+res);
}
}