一个周末做到这个题目,当时看到位运算,脑袋一疼,不擅长的东西啊 于是一开始用了unordered_map来计数

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param arr intvector 
     * @param k int 
     * @return int
     */
    int foundOnceNumber(vector<int>& arr, int k) {
        // write code here
        int size=arr.size();
        unordered_map<int, int> freq;
        
        for(int i=0;i<size;i++)
        {
            freq[arr[i]]++;
        }
        for(int i=0;i<freq.size();i++)
        {
            for(auto kv:freq){
                if(kv.second==1)
                    return kv.first;
            }
        }
        return 0;
    }
};

注意此处的map遍历

之后,去看了一篇题解,毕竟希望做了一题不要白做,既然提示是位运算,我不懂特备高深的,那么就理解一个简单易懂的:把arr向量里的数从第1位一直处理到32位,一位一位相加,比如 1 1 1 0 0 0 1 0 ...... 记录这个sum(1的个数) 值 如果sum可以整除以k 那么说明在第x位上 ans[x]=0 反之ans[x]=1 程序是学习一个题解的

class Solution {
public:
    int foundOnceNumber(vector<int>& arr, int k) {
        // write code here
        int res=0;
        for(int i=0;i<32;i++)	//一位一位遍历
        {
            int sum=0;
            for(auto num:arr)
            {
                sum+=num>>i &1;//获得每一个数字的第i位的数字(二进制下)
            }
            if(sum%k==1)//不可以整除 就说明不是k的倍数 那么这一位就是1
                res+=1<<i;
        }
        return res;
    }
};