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