(C++)剑指offer-拓展:数组中唯一只出现一次的数字(位运算)

(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;
    }
};

需要留意状态机对于上述问题的普遍通用解法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值