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; } }