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
(也可以通过暴力破解法破解,即额外开辟空间,然后扫描计数)
该博客介绍了一种利用位运算符解决数组中一个数出现1次其余数出现k次的问题。通过不进位加法的原理,将数组中的所有数字转换为k进制,然后进行位运算,最终得出只出现1次的数字。代码中展示了如何将数字转为k进制字符串,然后进行位运算求解,最后输出结果为9。
415

被折叠的 条评论
为什么被折叠?



