Single Number 2

Single Number 2


要求

Given an array of integers, every element appears three times except for one. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

标签:Bit manipulation


理解:

给定一个整数数组,其中只有一个元素出现一次,其余的都出现3次,找出出现一次的元素

线性时间复杂度,最好不适用额外的存储空间


我的提交:

    int singleNumber(int A[], int n) {
        //记录bit 1出现一次的位
        int once=0;
        //记录bit 1出现2两次的位
        int twice=0;
        //记录bit 1出现3三次的位
        int threetimes=0;

        int i;
        for(i=0;i<n;i++)
        {
                twice |= (A[i]&once); //屏蔽所有只出现一次的位
                once = once^A[i];
                threetimes = once&twice;
                twice &= ~threetimes;
                once &= ~threetimes;
        }

        return once;
    }

注意事项:

  • 3个int,once,twice,threetimes分别记录出现1次(或3rd出现),出现2次,出现3次的数(以二进制记录);因此,once,twice,threetimes重要的不是显示的数字,而是其二进制表示
  • 遍历数组
  • 位运算分析:
    1.twice |= (A[i]&once)

    可拆分为:

    temp=A[i]&once;

    twice=twice|temp;

    其中temp=A[i]&once:

    情况1:A[i]在once中有影响

    结果1:temp=A[i]

    情况2:A[i]在once中无影响

    情况3:A[i]曾经在once有影响,当在下面的XOR被取消

    结果2:temp=?

    twice=twice|temp

    情况1:temp==A[i]

    结果1:A[i]的影响融入twice

    情况2:temp==?

    结果2:twice保持原状

    twice包含了已出现2次的数的影响

    A[i]&once:&屏蔽非A[i]的位,使A[i]的影响可以加入twice

    once=once^A[i]

    2.once=once^A[i]

    情况1:A[i]已出现1次

    结果1:此次XOR将取消A[i]在once中的影响

    情况2:A[i] 1st出现

    情况3:A[i] 3rd出现

    结果2:A[i]的影响(重新)融入到once中

    3.threetimes=once&twice

    将出现3次,即在once与twice都有影响(once与twice对应位都是1的位)记录到threetimes中

    4.twice&=~threetimes;once&=~threetimes

    取消已出现3次的数在twice与once中的影响,排除这些数

  • 经过n次循环后,once中的位就是只出现一次的数的影响,是其二进制表示

  • Bit Manipulation is an Amazing tool!

P.S:此解法可能由于参考了其他解法而导致有相似之处,感谢他们的分享!也欢迎各位学友都对我的解法的不足之处作出建议!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值