位运算,异或(EOR)
题目
Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement itwithout using extra memory?
分析
1、位运算,暂不理解
2、排序:T(n)=O(nlogn)
3、map
CODE
用map,T(n)=O(nlogn),S(n)=O(n)
class Solution {
public:
int singleNumber(int A[], int n) {
map<int, int> mp;
for (auto it = begin(A); it != end(A); ++it) {
++mp[*it];
}
for (auto it = mp.begin(); it != mp.end(); ++it) {
if (it->second == 1) {
return it->first;
}
}
}
};
其他位运算:
1、请戳 我,此页面出现了多种算法。
int singleNumber(int A[], int n) {
int count[32] = {0};
int result = 0;
for (int i = 0; i < 32; i++) {
for (int j = 0; j < n; j++) {
if ((A[j] >> i) & 1) {
count[i]++;
}
}
result |= ((count[i] % 3) << i);
}
return result;
}
int singleNumber(int A[], int n) {
int ones = 0, twos = 0, threes = 0;
for (int i = 0; i < n; i++) {
twos |= ones & A[i];
ones ^= A[i];
threes = ones & twos;
ones &= ~threes;
twos &= ~threes;
}
return ones;
}
2、戳 我
public int singleNumber(int[] A) {
int ones = 0, twos = 0;
for(int i = 0; i < A.length; i++){
ones = (ones ^ A[i]) & ~twos;
twos = (twos ^ A[i]) & ~ones;
}
return ones;
}
3、非int的数组可以吗? 戳 我