Leetcode 137. 只出现一次的数字 II

题目描述

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

说明:

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

示例 1:

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

示例 2:

输入: [0,1,0,1,0,1,99]
输出: 99

解法

因为题目限定了数组中除了一个元素出现一次外,其他元素均出现三次。因为目前并没有三目运算符,所以可以利用现有的逻辑运算,来模拟三进制的不进位加法,对数组中每个元素进行加法运算,最后的结果就是只出现一次的元素。

参考二进制的不进位加法,即异或运算:

xor(1,1)=0
xor(1,0)=1
xor(0,0)=0

三进制的不进位加法中,有一点不同的是,xor(1,1)的结果应该存储起来,再遇到相同位置的1时,即累加到3时,不进位为0。类似于以下效果:

tor(1,1)=2
tor(2,1)=0

其中tor表示为三进制的不进位加法。

因为二进制位只能存储01,所以这里需要借助两个变量来存储一个三进制不进位加法的结果。ones表示二进制加法的结果,twos表示二进制加法的进位。如下所示:

tor(1,1)=(ones=0,twos=1)
tor(1,0)=(ones=1,twos=0)
tor(0,0)=(ones=0,twos=0)

计算规则:观察可以发现,ones的值等同于二进制的xor运算结果,twos用来存储1+1产生的进位,即等同于&与运算的结果。

所以以下代码示例中,使用ones存储二进制加法的结果,twos存储二进制加法的进位。

则对于元素num,根据计算规则,ones^num表示此次的二进制加法结果,不妨以half_ones=ones^num表示该值,若half_onestwos对应位上的值都为1,则产生进位,如下所示:

h,t=o
1,1=0
1,0=1
0,1=0
0,0=0

左边的h表示half_ones的位,中间的t表示twos的位,右侧的o表示ones的值,ones的值依赖half_onestwos的情况。观察可发现ones=half_ones&~twos,即ones=ones^num&~twos


由三进制的不进位加法规则可知,若twos与元素num的对应位上的值都为1,则置twosones的对应位为0ones的值已经经过处理,此处观察twosnum的对应位关系,如下所示:

t,n=h
1,1=0
1,0=1
0,1=0
0,0=0

左边的t表示twos的位,中间的n表示num的位,右侧的h表示half_twos的值,half_twos的值依赖twosnum的情况。观察可发现half_twos=twos&~num,此处的half_twos表示加num后,不进位置0的情况。

根据计算规则,新增的进位为ones&num,更新twos的结果为新增进位和原有进位置0的情况,即twos=(ones&num)|(twos&~num)

class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        ones,twos=0,0
        for num in nums:
            ones,twos=ones^num&~twos,ones&num|(twos&~num)
        return ones

参考
Single Number II(模拟三进制法,图表解析)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容