137. Single Number II


解法一:
map (哈希表)
时间复杂度: O(n)
空间复杂度:O(n)
class Solution { public: int singleNumber(vector<int>& nums) { int n = nums.size(); map<int, int> mp; mp.clear(); for(int i = 0; i < n; i++) mp[nums[i]]++; int ans = 0; for(auto u : mp) { if(u.second == 1) { ans = u.first; break; } } return ans; } };
解法二:
二进制位
记要找的那个数(即出现一次的数)为 ans,
由于数组中的元素都 int ( 32位整数 )范围内,因此我们可以依次计算答案的每一个二进制位是 0 还是 1。
如果当前数 x 不是 ans ,则必然出现了3次,那么它的第 i 位二进制位,必然出现了 0 或 3 次。
则 ans 的第 i 位二进制位就是所有元素第 i 个二进制位之和 余 3 的结果。
具体做法:
对于数组中的每一个元素 x , 使用位运算 (x >> i)& 1 得到 x 的第 i 个二进制位, 将它们相加再对 3 取余,得到的结果 不是 0 就是 1, 这个结果就是 ans 的第 i 个二进制位。
把 ans 的每一位组合成 ans : ans |= ( 1 << i ) ;
class Solution { public: int singleNumber(vector<int>& nums) { int ans = 0; for (int i = 0; i < 32; ++i) { int total = 0; for (int num: nums) { total += ((num >> i) & 1); } if (total % 3) { ans |= (1 << i); } } return ans; } };
注: 如果使用的语言对「有符号整数类型」和「无符号整数类型」没有区分,那么可能会得到错误的答案。
复杂度分析
时间复杂度:O(nlogC),其中 n 是数组的长度,C 是元素的数据范围
空间复杂度:O(1)。
解法三:
数字电路设计
解法四:
数字电路设计优化
浙公网安备 33010602011771号