(C++)剑指offer-拓展:数组中唯一只出现一次的数字
首先将数组中每个数字进行二进制表示,这样便可以统计每个位上对应1的次数,如果次数%3多1,则说明唯一出现一次的数字在该二进制位为1,因此记录到ans结果中并移一位ans = ans * 2 + 1;如果次数%3为0,说明该位只有三个相同的数字,因此直接移至下一位ans = 2 * ans,上述方法的整体时间复杂度为O(n),具体代码如下:
class Solution {
public:
int findNumberAppearingOnce(vector<int>& nums) {
int ans = 0;
for(int i = 31; i >=0; i--){
int cnt = 0;
for(auto x : nums){
if(x >> i & 1){
cnt++;
}
}
if(cnt % 3 == 1){
ans = ans * 2 + 1;
}
else
ans = ans * 2; //不管是不是余1均要移动,因此ans*2
}
return ans;
}
};
需要留意状态机对于上述问题的普遍通用解法。