Java算法–第一章–位运算符(8)出现k次与出现1次
题目:数组中只有一个数出现了1次,其他的数都出现了k次,请输出只出现了1次的数。
补充知识点:(1)2个相同的二进制数做不进位加法,结果为零;
(2)10个相同的十进制数做不进位加法,结果位零;
(3)k个相同的k进制数做不进制加法,结果为零
代码:
package exer1;
public class 出现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};
int len = arr.length;
char[][] kRadix = new char[len][];
int k = 3;
//转换成k进制字符数组
int maxLen = 0;
//对于每个数字
for (int i = 0; i < len; i++) {
//求每一数字的三进制字符穿并翻转,然后转为字符数组
kRadix[i] = new StringBuilder(Integer.toString(arr[i], k)).reverse().toString().toCharArray();
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 {
//加上一个数字,减‘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));//乘k的i次方
}
System.out.println(res);
}
}
输出:
9
(也可以通过暴力破解法破解,即额外开辟空间,然后扫描计数)