一个周末做到这个题目,当时看到位运算,脑袋一疼,不擅长的东西啊 于是一开始用了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;
}
};