因为除了出现一次的那个数,其他数都出现k次,那么这些出现k次的数,它对应的二进制位中,为1的bit位,也是出现k次的,那么就可以用一个大小为32的数组,记录数组中所有数在这32个bit位中,出现的1的次数,最终出现1次的数,它对应的为1的bit位中1出现的次数必定是对k取模余1的,那么这32个bit位中,谁对k取模,就将一个1向左移动对应数量的位,将所有这些移动后的数相加就是出现一次的数了。

    public int foundOnceNumber (int[] arr, int k) {
        // write code here

        if (arr == null){
            return 0;
        }

        int[] bitValue = new int[32];

        for (int i : arr) {
            for (int j = 0; j < 32; j++) {

                int cur = 1 << j;
                if ((cur & i) != 0){
                    bitValue[j] ++;
                }
            }

        }

        int res = 0;
        for (int i = 0; i < bitValue.length; i++) {

            if (bitValue[i] % k != 0){
                res += (1 << i);
            }
        }

        return res;
    }