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