2019-06-02 15:09:36spa
Single Number 问题其实我很早就遇到了,当时仍是第一次刷leetcode,那个时候彻底没有想到怎么在<O(n), O(1)>完成这个解答,看了答案以后才恍然大悟,原来可使用异或来解决。这个问题还有不少的变种问题,好比1-n的数字缺乏了一个,找到缺失的那一个(补齐1 - n, 就变成了Single Number),等等。code
后来接触题目渐多以后,发现原来Single Number只是一个特例,这个问题可扩展性很是强。blog
1、Single Numberleetcode
问题描述:class
问题求解:扩展
经典的使用异或解决的问题。im
public int singleNumber(int[] nums) { int res = 0; for (int num : nums) res ^= num; return res; }
2、Single Number IIimg
问题描述:di
问题求解:co
结合Single Number,SN问题本质上是因为对于异或操做来讲,每一位置上若是出现了两个1,那么就会归零。考虑到这个问题,若是咱们能定义一个“异或操做”,对于每一个位出现3次1就归零就行了。那么,显然的对于每个位仅仅采用原生的01就不够了,咱们须要至少两位才能表征0,1, 2, 3这三个状态。
真值表以下:
根据真值表,咱们很容易就能推算出a,b的递推公式:
a = a!b!c + !abc
b = !ab!c + !a!bc
显然的是ab == 00表明的是0,ab中任意一位为1的时候表明的是1,那么最后的结果就是a | b。
public int singleNumber(int[] nums) { int a = 0; int b = 0; for (int c : nums) { int _a = a; a = (a & ~b & ~c) | (~a & b & c); b = (~_a & b & ~c) | (~_a & ~b & c); } return a | b; }