LeetCode-single-number-ii

题目

题目描述
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?

解题思路

用二进制去模拟三进制,设a是高位,b是低位
三个相同的数(b为1或0)相加,记这个数为c
1.b=1, c+c+c => b=0
2.b=0, c+c+c => b=0

A的卡诺图(状态转移)

AB C 0 1
00 0 0
01 0 1
10 1 0

B的卡诺图(状态转移)

AB C 0 1
00 0 1
01 1 0
10 0 0

总的卡诺图(状态转移)

此时状态 ta tb c a b
已加上0个c 0 0 0 0 0
已加上0个c 0 0 1 0 1
已加上1个c 0 1 0 0 1
已加上1个c 0 1 1 1 0
已加上2个c 1 0 0 1 0
已加上2个c 1 0 1 0 0

因此可以得出:
a = (ta & ~tb & ~c) | (~ta & tb & c)
b = ~ta & ((~tb & c) | (tb & ~c))

Note
数组[2,1,3,2,3,3,2]和数组[2,2,2,3,3,3,1]运算结果是一样的,因为位运算是满足交换律的。

Code

public class Solution {
    public int singleNumber(int[] A) {
        int a = 0;
        int b = 0;
        for(int c : A){
            int ta, tb;
            ta = a;
            tb = b;
            a = (ta&~tb&~c) | (~ta&tb&c);
            b = ~ta&((~tb&c)|(tb&~c));
        }
        return a|b;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 9,072评论 0 13
  • My code: My test result: 这道题目,看了之后就决定看答案了,bit manipulatio...
    Richardo92阅读 510评论 0 1
  • 1.埋点是做什么的 2.如何进行埋点 3.埋点方案的设计 近期常被问到这个问题,我担心我的答案会将一些天真烂漫的孩...
    lxg阅读 2,033评论 0 1
  • 选择题部分 1.(),只有在发生短路事故时或者在负荷电流较大时,变流器中才会有足够的二次电流作为继电保护跳闸之用。...
    skystarwuwei阅读 13,576评论 0 7
  • 选择题部分 1.()部门负责日常监督检查工作,安全巡视的同时进行消防检查,推动消防安全制度的贯彻落实。 A: 消防...
    skystarwuwei阅读 15,658评论 0 3