[leetcode]巧用状态转换的第十九天

      137.只出现一次的数字。给定一个数字列表,其中除了一个数字与其他都不同以外,其他的数字都出现了三次,要求输出这个单独的数字。这道题有一个低阶版本,就是其他数字出现两次,可以巧妙地利用异或运算,与本身异或为0,与0异或为本身,那么将所有数字全都进行异或运算,相同的数字都变成0而最后留下单独的数字,那么很自然的就想,能不能用类似的方法解决这道题呢?

      首先分析一下这道题出现的情况,明显就是要区分出现1次和出现3次的数字。回到低阶版本,可以认为使用1和0对不同出现次数的数字进行了区分,那么要区分出现3次和1次的数字,至少就需要2位二进制码,比如(不唯一)用10表示出现一次,用01表示出现两次,用00表示出现3次,那么全部参与运算之后只要找到10表示的数就可以了。这个过程类似逻辑推理,可以通过真值表更清晰的展示出来。

      设当前状态为XY,输入为Z,于是就能得到

XY

Z

X

Y

00

0

0

0

00

1

1

0

10

0

1

0

10

1

0

1

01

0

0

1

01

1

0

0



      于是我们就可以得到Y​=~X⋅(Y⊕Z),同理也可以得到X的计算公式,于是问题也就变成了将所有数字计算结束后Y=1的那个,问题也就解决了。

posted @ 2020-10-12 17:17  小小的豪猪窝  阅读(108)  评论(0编辑  收藏  举报