在一个数组中除了一个数字只出现一次之外,其他数字都出现了三次。
请找出那个只出现一次的数字。
你可以假设满足条件的数字一定存在。
思考题:
- 如果要求只使用 O(n)O(n) 的时间和额外 O(1)O(1) 的空间,该怎么做呢?
样例
输入:[1,1,1,2,2,2,3,4,4,4]
输出:3
解题思路:
状态机:
初始状态(0,0)
和1进行运算
(0,0)-(1,0)-(0,1)-(0,0)
和0进行运算,回到自身
int findNumberAppearingOnce(vector<int>& nums) {
int ones=0,two=0;
for(auto x:nums){
ones=(ones^x)&~two;
two=(two^x)&~ones;
}
return ones;
}
其它正常的解题思路:看每一位1的数量 https://www.acwing.com/solution/content/2618/
int findNumberAppearingOnce(vector<int>& nums) {
int ans = 0;
for (int i = 31; i >= 0; --i) {//从最高位向最低位开始
int cnt = 0;// 该位1的数量
for (int x: nums) {
if (x >> i & 1) {
cnt ++;
}
}
if (cnt % 3 == 1) {
ans = (ans * 2) + 1;
}
else {
ans = ans * 2;
}
}
return ans;
}