目标:在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。
不能像 上一题 一样用异或分组的方法,根据数据特点来设计算法,看到了数电状态机的方法和遍历统计的方法。参考:面试题56 - II. 数组中数字出现的次数 II(位运算 + 有限状态自动机,清晰图解)
1.状态机(用到了数电时序逻辑电路分析状态转移图的内容,只分析一位的状态转移,int 31位每一位规则都相同)
2.遍历统计(nums在int范围内31位每一位相加,对3求余后得到所求数字,注意count数组和移位的顺序)
class Solution {
public:
int singleNumber(vector<int>& nums) {
vector<int>count(32,0);
int res=0;
for(auto num:nums){
for(int i=0;i<32;i++){
count[i]+=(num>>i&1); //num的值不会改变,从0-32:低-高
}
}
for(int i=31;i>=0;i--){
res<<=1; //左移越来越高位,故count下标从高位算起
res|=(count[i]%3);
}
return res;
}
};