Single Number 2

来源:互联网 发布:淘宝卖qq号怎么卖 编辑:程序博客网 时间:2024/06/05 02:47

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

0 0
原创粉丝点击