<LeetCode>137. 只出现一次的数字 II

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,3,2]
输出: 3

示例 2:

输入: [0,1,0,1,0,1,99]
输出: 99
解题思路——
1. 这里要用到位操作的概念,按位与操作&,按位或操作|,异或操作^.
2. 在你了解上面操作之后,明确一下下面算法的思路。这个数组有3*n + 1的数字,那么就把他们转化为长度为32位的2进制,就必然存在3*x的1,3*y的0,其中x + y = 32 * n.因为比如说n=1,就是数组有4个数字,那么有三个相同的数字,每个数字表示成2进制,就是相当于有3个32位的二进制数一样,而且每一位都是一样的。
哎哟,反正你这边理解就行了,要把这些数字都理解成是32位的2进制编码就行了。
3. 然后你相信,如果不看哪个特殊的数字,那么显然,1的总数量和0的总数量一定是3的倍数对不对?
4. 但是实际上,1和0的总数量不一定是3的倍数,为什么?就是因为那个特殊的不同的数字啊。
5. 好,如果我告诉你,32位的第5位,1的数量不是3的倍数,比如说1的数量是16,说明什么??没错,说明那个特殊数字的32位二进制表示的第5位是1.
6 按照这个思路,去理解代码吧。


class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int length = nums.size();
        int result = 0;
        for(int i=0;i<32;i++)
        {
            int mask = 1<<i;
            int cnt = 0;
            for(int j=0;j<length;j++)
            {
                if(mask & nums[j])
                    cnt++;
            }
            if(cnt%3)
                result |= mask;
        }
        return result;
    }
};


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值