若k为偶数,经过全部数按位异或以后将直接得到只出现一次的数;
若k为奇数,则其他的数各bit位都会出现k次,可通过求只出现一次的数的各个比特位间接求解。

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param arr intvector 
     * @param k int 
     * @return int
     */
    int foundOnceNumber(vector<int>& arr, int k) {
        // write code here
        int ret = 0;

        //若出现的k为偶数次直接进行异或;
        if(k%2==0)
        {
            for(auto& a: arr)
            {
                ret ^= a;
            }
        }
        else
        {
            //若出现k次则该数的每一个比特位都会出现k次,求每个比特位的和对k求余可得只出现一次的数的比特位;
            for(int i=0;i<=31;i++)
            {
                int count = 0;
                for(auto& a: arr)
                {
                    //依次统计各个bit位;
                    count += (a>>i)&1;
                }
                //count%k为只出现一次的数的比特位,移位转成十进制;
                ret += (count%k) << i;
            }
        }
        return ret;
    }
};