简单模式:数组中只有一个数出现一次,其他均出现两次,请找出这个数。
1 | //原理:a ^ a = 0 a ^ 0 = a |
进阶模式:数组中只有一个数出现一次,其他均出现三次,请找出这个数。(题目来自力扣137)
例:
【1,2,3,2,4,4,3,4,2,3】
0001
0010
0011
0010
0100
0100
0011
0100
0010
0011
++++
0364
%%%%3
0001
1 | // |
算法改进
第i位(ai,bi)初始(00)连续经过三个零或三个1又变回(00)
(00)->(01)->(10)->(00)
| (ai,bi) | xi | 新(ai,bi) |
|---|---|---|
| 00 | 0 | 00 |
| 00 | 1 | 01 |
| 01 | 0 | 01 |
| 01 | 1 | 10 |
| 10 | 0 | 10 |
| 10 | 1 | 00 |
a = (~a & b & x) | (a & ~b & ~x)
b = ~a & (b ^ x)
最后结果:ai=0 ,bi=0/1,即返回b即可。
1 | int FindOnlySum(vector<int>& nums) { |
进一步改进–同时计算改为分步计算
因为bi计算更简单,所以我们先计算bi,再用新bi计算ai。
(00)->(01) => (00)->(01)->(01)
| (ai,bi) | xi | 新bi |
|---|---|---|
| 00 | 0 | 0 |
| 00 | 1 | 1 |
| 01 | 0 | 1 |
| 01 | 1 | 0 |
| 10 | 0 | 0 |
| 10 | 1 | 0 |
| (新ai,bi) | xi | 新ai |
|---|---|---|
| 00 | 0 | 0 |
| 01 | 1 | 0 |
| 01 | 0 | 0 |
| 00 | 1 | 1 |
| 10 | 0 | 1 |
| 10 | 1 | 0 |
b = ~a & (b ˆ x)
a = ~b & (a ˆ x)
1 | class Solution { |
原文链接: https://kettycode.github.io/2023/10/23/bitSum/找出单身狗/
版权声明: 转载请注明出处.