若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;
}
};
京公网安备 11010502036488号