位运算

Single Number :  一个整数数列,除其中一个数以外,其他数都出现2次;试找出这个数 

要求线性复杂度,且不用什么额外空间。

解题思路:

寻找一种位运算[1],满足结合律、交换律,且2个相同的数做该运算会得到单位元。

很容易想到位运算 同或,异或。以异或为例,

0^1 = 1,

0^0 = 0,

1^1 = 0.

0为单位元。满足交换律,结合律。

所有出现两次的数做按位异或运算得到0 (00000...),单位元0再与只出现一次的数运算,得到的结果还是这个数。

Single Number II:  一个整数数列,除其中一个数以外,其他数都出现3次;试找出这个数 

要求线性复杂度,且不用什么额外空间。

解题思路:

寻找一种位运算,满足结合律、交换律,且3个相同的数做该运算会得到单位元。

试遍了8种 (要满足交换律)从{0,1} ->{0,1} 的位运算,根本不能。有时候思路难免过于局限。

这种运算是什么呢?  add bit by bit but mod 3.

 1 int singleNumber(int A[], int n) {
 2     
 3     int carrier = 0, sum = 0,oneBits;
 4     int i = 0;
 5     for (;i< n;i++)
 6     {
 7         carrier += sum&A[i];
 8         sum ^= A[i];
 9         
10         oneBits = carrier&sum;
11         
12         carrier ^= oneBits;
13         sum ^= oneBits;
14     }
15     
16     return (carrier<<1) + sum;
17         
18 }

[1]位运算:因为最后要恢复只出现一次的那个数,按位运算可以保证维度。

题目来源:

https://leetcode.com/problems/single-number/ 

https://leetcode.com/problems/single-number-ii/ 

原文地址:https://www.cnblogs.com/garcia-0/p/4341964.html