File tree 8 files changed +94
-115
lines changed
lcof/面试题56 - I. 数组中数字出现的次数
solution/0200-0299/0260.Single Number III
8 files changed +94
-115
lines changed Original file line number Diff line number Diff line change 26
26
27
27
异或运算求解。
28
28
29
- 首先明确,两个相同的数异或之后的结果为 0。对该数组所有元素进行异或运算,结果就是** 两个只出现一次的数字异或的结果** 。找出这个结果中某个二进制位为 1 的位置,之后对数组所有元素进行分类,二进制位为 0 的异或到 a,二进制位为 1 的异或到 b,结果就是 a,b。
29
+ 首先明确,两个相同的数异或之后的结果为 0。对该数组所有元素进行异或运算,结果就是** 两个只出现一次的数字异或的结果** ,即 ` eor = a ^ b `
30
+
31
+ 找出这个结果 eor 中最后一个二进制位为 1 而其余位为 0 的数,即 ` eor & (~eor + 1) ` ,之后遍历数组所有元素,二进制位为 0 的元素异或到 a。
32
+
33
+ 遍历结束后 ` b = eor ^ a ` ,返回结果即可。
30
34
31
35
<!-- tabs:start -->
32
36
35
39
``` python
36
40
class Solution :
37
41
def singleNumbers (self , nums : List[int ]) -> List[int ]:
38
- xor_res = 0
42
+ eor = 0
39
43
for num in nums:
40
- xor_res ^= num
41
- pos = 0
42
- while (xor_res & 1 ) == 0 :
43
- pos += 1
44
- xor_res >>= 1
45
-
46
- a = b = 0
44
+ eor ^= num
45
+ # 找出最右边的 1
46
+ diff = eor & (~ eor + 1 )
47
+ a = 0
47
48
for num in nums:
48
- t = num >> pos
49
- if (t & 1 ) == 0 :
49
+ if (num & diff) == 0 :
50
50
a ^= num
51
- else :
52
- b ^= num
51
+ b = eor ^ a
53
52
return [a, b]
54
53
```
55
54
@@ -58,25 +57,20 @@ class Solution:
58
57
``` java
59
58
class Solution {
60
59
public int [] singleNumbers (int [] nums ) {
61
- int xor = 0 ;
60
+ int eor = 0 ;
62
61
for (int num : nums) {
63
- xor ^ = num;
62
+ eor ^ = num;
64
63
}
65
- int pos = 0 ;
66
- while ((xor & 1 ) == 0 ) {
67
- ++ pos;
68
- xor >> = 1 ;
69
- }
70
- int a = 0 , b = 0 ;
64
+ // # 找出最右边的 1
65
+ int diff = eor & (~ eor + 1 );
66
+ int a = 0 ;
71
67
for (int num : nums) {
72
- int t = num >> pos;
73
- if ((t & 1 ) == 0 ) {
68
+ if ((num & diff) == 0 ) {
74
69
a ^ = num;
75
- } else {
76
- b ^ = num;
77
70
}
78
71
}
79
- return new int [] {a, b};
72
+ int b = eor ^ a;
73
+ return new int []{a, b};
80
74
}
81
75
}
82
76
```
@@ -89,24 +83,19 @@ class Solution {
89
83
* @return {number[]}
90
84
*/
91
85
var singleNumbers = function (nums ) {
92
- let xor = 0 ;
93
- let bit = 1 ;
94
- let res = [0 , 0 ];
86
+ let eor = 0 ;
95
87
for (let num of nums) {
96
- xor ^= num;
97
- }
98
- while ((xor & 1 ) === 0 ) {
99
- xor >>= 1 ;
100
- bit <<= 1 ;
88
+ eor ^= num;
101
89
}
90
+ const diff = eor & (~ eor + 1 );
91
+ let a = 0 ;
102
92
for (let num of nums) {
103
- if ((num & bit) === 0 ) {
104
- res[0 ] ^= num;
105
- } else {
106
- res[1 ] ^= num;
93
+ if ((num & diff) == 0 ) {
94
+ a ^= num;
107
95
}
108
96
}
109
- return res;
97
+ let b = eor ^ a;
98
+ return [a, b];
110
99
};
111
100
```
112
101
Original file line number Diff line number Diff line change 1
1
class Solution {
2
2
public int [] singleNumbers (int [] nums ) {
3
- int xor = 0 ;
3
+ int eor = 0 ;
4
4
for (int num : nums ) {
5
- xor ^= num ;
5
+ eor ^= num ;
6
6
}
7
- int pos = 0 ;
8
- while ((xor & 1 ) == 0 ) {
9
- ++pos ;
10
- xor >>= 1 ;
11
- }
12
- int a = 0 , b = 0 ;
7
+ // # 找出最右边的 1
8
+ int diff = eor & (~eor + 1 );
9
+ int a = 0 ;
13
10
for (int num : nums ) {
14
- int t = num >> pos ;
15
- if ((t & 1 ) == 0 ) {
11
+ if ((num & diff ) == 0 ) {
16
12
a ^= num ;
17
- } else {
18
- b ^= num ;
19
13
}
20
14
}
21
- return new int [] { a , b };
15
+ int b = eor ^ a ;
16
+ return new int []{a , b };
22
17
}
23
18
}
Original file line number Diff line number Diff line change 3
3
* @return {number[] }
4
4
*/
5
5
var singleNumbers = function ( nums ) {
6
- let xor = 0 ;
7
- let bit = 1 ;
8
- let res = [ 0 , 0 ] ;
6
+ let eor = 0 ;
9
7
for ( let num of nums ) {
10
- xor ^= num ;
11
- }
12
- while ( ( xor & 1 ) === 0 ) {
13
- xor >>= 1 ;
14
- bit <<= 1 ;
8
+ eor ^= num ;
15
9
}
10
+ const diff = eor & ( ~ eor + 1 ) ;
11
+ let a = 0 ;
16
12
for ( let num of nums ) {
17
- if ( ( num & bit ) === 0 ) {
18
- res [ 0 ] ^= num ;
19
- } else {
20
- res [ 1 ] ^= num ;
13
+ if ( ( num & diff ) == 0 ) {
14
+ a ^= num ;
21
15
}
22
16
}
23
- return res ;
17
+ let b = eor ^ a ;
18
+ return [ a , b ] ;
24
19
} ;
Original file line number Diff line number Diff line change 1
1
class Solution :
2
2
def singleNumbers (self , nums : List [int ]) -> List [int ]:
3
- xor_res = 0
3
+ eor = 0
4
4
for num in nums :
5
- xor_res ^= num
6
- pos = 0
7
- while (xor_res & 1 ) == 0 :
8
- pos += 1
9
- xor_res >>= 1
10
-
11
- a = b = 0
5
+ eor ^= num
6
+ # 找出最右边的 1
7
+ diff = eor & (~ eor + 1 )
8
+ a = 0
12
9
for num in nums :
13
- t = num >> pos
14
- if (t & 1 ) == 0 :
10
+ if (num & diff ) == 0 :
15
11
a ^= num
16
- else :
17
- b ^= num
12
+ b = eor ^ a
18
13
return [a , b ]
Original file line number Diff line number Diff line change 32
32
``` python
33
33
class Solution :
34
34
def singleNumber (self , nums : List[int ]) -> List[int ]:
35
- xor = 0
35
+ eor = 0
36
36
for num in nums:
37
- xor ^= num
38
- # x & (-x) 是保留位中最右边 1 ,且将其余的 1 设位 0 的方法
39
- diff = xor & (- xor )
40
- a = b = 0
37
+ eor ^= num
38
+ # 提取最右边的 1
39
+ diff = eor & (~ eor + 1 )
40
+ a = 0
41
41
for num in nums:
42
42
if (num & diff) == 0 :
43
43
a ^= num
44
- else :
45
- b ^= num
44
+ b = eor ^ a
46
45
return [a, b]
47
46
```
48
47
@@ -53,16 +52,19 @@ class Solution:
53
52
``` java
54
53
class Solution {
55
54
public int [] singleNumber (int [] nums ) {
56
- int xor = 0 ;
55
+ int eor = 0 ;
57
56
for (int num : nums) {
58
- xor ^ = num;
57
+ eor ^ = num;
59
58
}
60
- int diff = xor & (- xor);
61
- int a = 0 , b = 0 ;
59
+ // 提取最右的 1
60
+ int diff = eor & (~ eor + 1 );
61
+ int a = 0 ;
62
62
for (int num : nums) {
63
- if ((num & diff) == 0 ) a ^ = num;
64
- else b ^ = num;
63
+ if ((num & diff) == 0 ) {
64
+ a ^ = num;
65
+ }
65
66
}
67
+ int b = eor ^ a;
66
68
return new int []{a, b};
67
69
}
68
70
}
Original file line number Diff line number Diff line change 30
30
``` python
31
31
class Solution :
32
32
def singleNumber (self , nums : List[int ]) -> List[int ]:
33
- xor = 0
33
+ eor = 0
34
34
for num in nums:
35
- xor ^= num
36
- diff = xor & (- xor )
37
- a = b = 0
35
+ eor ^= num
36
+ diff = eor & (~ eor + 1 )
37
+ a = 0
38
38
for num in nums:
39
39
if (num & diff) == 0 :
40
40
a ^= num
41
- else :
42
- b ^= num
41
+ b = eor ^ a
43
42
return [a, b]
44
-
45
43
```
46
44
47
45
### ** Java**
48
46
49
47
``` java
50
48
class Solution {
51
49
public int [] singleNumber (int [] nums ) {
52
- int xor = 0 ;
50
+ int eor = 0 ;
53
51
for (int num : nums) {
54
- xor ^ = num;
52
+ eor ^ = num;
55
53
}
56
- int diff = xor & (- xor );
57
- int a = 0 , b = 0 ;
54
+ int diff = eor & (~ eor + 1 );
55
+ int a = 0 ;
58
56
for (int num : nums) {
59
- if ((num & diff) == 0 ) a ^ = num;
60
- else b ^ = num;
57
+ if ((num & diff) == 0 ) {
58
+ a ^ = num;
59
+ }
61
60
}
61
+ int b = eor ^ a;
62
62
return new int []{a, b};
63
63
}
64
64
}
Original file line number Diff line number Diff line change 1
1
class Solution {
2
2
public int [] singleNumber (int [] nums ) {
3
- int xor = 0 ;
3
+ int eor = 0 ;
4
4
for (int num : nums ) {
5
- xor ^= num ;
5
+ eor ^= num ;
6
6
}
7
- int diff = xor & (-xor );
8
- int a = 0 , b = 0 ;
7
+ // 提取最右的 1
8
+ int diff = eor & (~eor + 1 );
9
+ int a = 0 ;
9
10
for (int num : nums ) {
10
- if ((num & diff ) == 0 ) a ^= num ;
11
- else b ^= num ;
11
+ if ((num & diff ) == 0 ) {
12
+ a ^= num ;
13
+ }
12
14
}
15
+ int b = eor ^ a ;
13
16
return new int []{a , b };
14
17
}
15
18
}
Original file line number Diff line number Diff line change 1
1
class Solution :
2
2
def singleNumber (self , nums : List [int ]) -> List [int ]:
3
- xor = 0
3
+ eor = 0
4
4
for num in nums :
5
- xor ^= num
6
- diff = xor & (- xor )
7
- a = b = 0
5
+ eor ^= num
6
+ # 提取最右边的 1
7
+ diff = eor & (~ eor + 1 )
8
+ a = 0
8
9
for num in nums :
9
10
if (num & diff ) == 0 :
10
11
a ^= num
11
- else :
12
- b ^= num
12
+ b = eor ^ a
13
13
return [a , b ]
You can’t perform that action at this time.
0 commit comments