题目如下:
public class 出现K次与出现1次 {
/**
* @param args
*/
public static void main(String[] args) {
// mytest();
// 位运算解法
int a[] = { 2, 2, 2, 9, 7, 7, 7, 3, 3, 3, 4, 4, 4, 5, 5, 5 };
int len = a.length;
// 转成K进制字符数组
//字符的二维数组,用来存储每个数字的三进制的每一位
char[][] kRadix = new char[len][];
int k = 3;
//记录最长的三进制位数,这样才知道有多少列
int maxLen = 0;
// 对于每个数字
for (int i = 0; i < len; i++) {
//求每个数字的三进制字符串并翻转,然后转为字符数组
kRadix[i] = new StringBuilder(Integer.toString(a[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) {
//不足最长列数的三进制数,后面补0
resArr[j] += 0;
} else {
//否则家加上当前这一位的数字(减去'0',就是将字符转换为数字)
resArr[j] += (kRadix[i][j] - '0');
}
}
}
int res = 0;
for (int i = 0; i < maxLen; i++) {
//取余之后乘以k的i次方,例如8%3=2, 看2在哪一列,如果在第一列乘以3的0次方,第二列乘以3的1次方
res += (resArr[i] % k) * (int) (Math.pow(k, i));
}
System.out.println(res);
}
public static void mytest() {
int a[] = { 2, 2, 2, 9, 7, 7, 7, 3, 3, 3, 4, 4, 4, 5, 5, 5 };
int[] helper = new int[a.length];
for (int i = 0; i < helper.length; i++) {
helper[a[i]]++;
}
for (int i = 0; i < helper.length; i++) {
if (helper[i] == 1) {
System.out.println(i);
break;
}
}
}
}