思路1 哈希
哈希,简单是简单,就是怕面试挂的太快
class Solution {
public:
int singleNumber(vector<int>& nums) {
// B A B C C B C
// 哈希
unordered_map<int, int> dic;
for(int num:nums){
dic[num]++;
}
for(int num:nums){
if (dic[num]==1)
return num;
}
return 0;
}
};
思路2 位运算
上图出处
作者:monstersamarua
链接:https://leetcode-cn.com/problems/shu-zu-zhong-shu-zi-chu-xian-de-ci-shu-ii-lcof/solution/shu-zu-zhong-chu-xian-1ci-2ci-de-shu-zi-emt54/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int res = 0;
for(int i=0;i<32;i++){
// 从低位开始,计算只出现一次的那个数在当前位上的十进制数值(如果为1,就是1<<i,否则就是0)
int temp = 0; // 当前位置上所有数加起来`1`的个数
for(int num:nums){
// 计算所有数加起来在第i位上有多少个1
// i= 1, 2, 3, 4...
// (1<<i) = 1, 10, 100, 1000,....
if (num & (1<<i))
temp++;
}
// 当前位置上只剩下只出现一次的那个数的数值
temp = temp % 3; // temp非0即1
res += (temp<<i); // 第i位为'1',其十进制数为 temp<<i
}
return res;
}
};