- 具体看注释,主要采用移位的操作,首先把所有数字的对应位相加,然后%k.因为都是K个,所以对应位会变成0.对于单独出现的一个,那一位就不会是0,而会是1. 因此,只需要 算出这些,然后 1<<i,依次相加即可。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param arr intvector
* @param k int
* @return int
*/
int foundOnceNumber(vector<int>& arr, int k) {
// write code here
vector<int> dp(32,0); //保存所有数字二进制中1的个数
int res = 0;
for(int i=0; i< arr.size(); i++){
for(int j =0; j< 32; j++){
if((arr[i]>>j)&1){//通过移位的方式,判断该位是不是1(逐位判断)
dp[j]++;
}
}
}
//返回结果
for(int i =0; i<32;i++){
if((dp[i]%k) & 1){
res+= 1<<i; // 从低位,依次左移相加,即可得到原值
}
}
return res;
}
};