前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Leetcode 137. 只出现一次的数字 II

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

作者头像
zhipingChen
发布2019-10-08 15:38:11
2620
发布2019-10-08 15:38:11
举报
文章被收录于专栏:编程理解编程理解

题目描述

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

说明:

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

示例 1:

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

示例 2:

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

解法

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

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

代码语言:javascript
复制
xor(1,1)=0
xor(1,0)=1
xor(0,0)=0

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

代码语言:javascript
复制
tor(1,1)=2
tor(2,1)=0

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

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

代码语言:javascript
复制
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,则产生进位,如下所示:

代码语言:javascript
复制
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的对应位关系,如下所示:

代码语言:javascript
复制
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)

代码语言:javascript
复制
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(模拟三进制法,图表解析)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019.10.06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档