思路
假如現在 ,陣列是 。 首先將每個數字都轉成二進制,並記錄每個位置出現的次數。
- :對二進制的來說,它會在位置一共給出次的貢獻。
- :對二進制的來說,它會在位置一共給出次的貢獻。
- :對二進制的來說,它會在位置一共給出次的貢獻。
- :對二進制的來說,它會在位置一共給出次的貢獻。 若是不考慮出現次的數字,每個位置出現的次數都會是的倍數,因此,只要將各自位置的總和之後,就能反推出出現次的數字了。
程式碼
位運算
class Solution {
public:
int singleNumber(vector<int>& nums) {
const int m = 3;
int cnt[32]{};
for(int num : nums) {
for(int i = 0; i < 32; ++i) {
cnt[i] += (num >> i) & 1;
}
}
int res = 0;
for(int i = 0; i < 32; ++i) {
if(cnt[i] % m != 0) {
res |= 1 << i;
}
}
return res;
}
};
複雜度分析
- 時間複雜度:
- 空間複雜度: