import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param arr int一维数组
* @param k int
* @return int
*/
public int foundOnceNumber (int[] arr, int k) {
// Java 中,int 有 32 位
int[] count = new int[32];
for (int i = 0; i < arr.length; i++) {
// 将所有数的对应二进制位进行求和
for (int j = 0; j < 32; j++) {
/**
* &同为1时为1,否则为0
* 假如3个2 1个3
* 2的二进制为
* 00000000000000000000000000000010
* & 1 相当于
* 00000000000000000000000000000001
* 第一次 bits[0] = 0 代表2的二进制的低1位是0
*/
count[j] += arr[i] & 1;
/**
* 相当于每次无符号右移1位 高位补0
* 如2 >>> 1
* 2的二进制:
* 00000000000000000000000000000010
* >>> 1
* 00000000000000000000000000000001
* 相当于判断bits中
* 目的让第2次 bits[1] = 1 不停的和1做&运算 即拿2的2进制每一位 从低1位到高32位与1进行比较
* 同为1的时候 说明2的二进制当前位置是1 否则为0
*/
arr[i] = arr[i] >>> 1;
}
}
int res = 0;
// 求和之后再取出来,同时要取模操作
for (int a = 1; a <= 32; a++) {
res = res << 1;
/**
*
* |同为0时为0,否则为1
* bits存的是从低1位到高32位,所以这里要逆向
*/
// 有 k 个相同的 1, 则 k % k == 0,剩下的就是多出来的那个数
res |= count[32-a] % k;
}
return res;
}
}