File tree Expand file tree Collapse file tree 2 files changed +54
-4
lines changed
leetcode/0137.Single-Number-II
website/content/ChapterFour/0100~0199 Expand file tree Collapse file tree 2 files changed +54
-4
lines changed Original file line number Diff line number Diff line change @@ -30,9 +30,9 @@ Your algorithm should have a linear runtime complexity. Could you implement it w
30
30
## 解题思路
31
31
32
32
- 这一题是第 136 题的加强版。这类题也可以扩展,在数组中每个元素都出现 5 次,找出只出现 1 次的数。
33
- - 本题中要求找出只出现 1 次的数,出现 3 次的数都要被消除。第 136 题是消除出现 2 次的数。这一题也会相当相同的解法,出现 3 次的数也要被消除。定义状态,00、10、01,这 3 个状态。当一个数出现 3 次,那么它每个位置上的 1 出现的次数肯定是 3 的倍数,所以当 1 出现 3 次以后,就归零清除。如何能做到这点呢?仿造` 三进制(00,10,01 ) ` 就可以做到。
33
+ - 本题中要求找出只出现 1 次的数,出现 3 次的数都要被消除。第 136 题是消除出现 2 次的数。这一题也会相当相同的解法,出现 3 次的数也要被消除。定义状态,00、10、01,这 3 个状态。当一个数出现 3 次,那么它每个位置上的 1 出现的次数肯定是 3 的倍数,所以当 1 出现 3 次以后,就归零清除。如何能做到这点呢?仿造` 三进制(00,01,10 ) ` 就可以做到。
34
34
- 变量 ones 中记录遍历中每个位上出现 1 的个数。将它与 A[ i] 进行异或,目的是:
35
- - 每位上两者都是 1 的,表示历史统计结果 ones 出现1次、A[ i] 中又出现1次 ,则是出现 2 次,需要进位到 twos 变量中。
35
+ - 每位上两者都是 1 的,表示历史统计结果 ones 出现1次、A[ i] 中又出现 1 次 ,则是出现 2 次,需要进位到 twos 变量中。
36
36
- 每位上两者分别为 0、1 的,加入到 ones 统计结果中。
37
37
- 最后还要 & ^twos ,是为了能做到三进制,出现 3 次就清零。例如 ones = x,那么 twos = 0,当 twos = x,那么 ones = 0;
38
38
- 变量 twos 中记录遍历中每个位上出现 1 ,2次 的个数。与 A[ i] 进行异或的目的和上述描述相同,不再赘述。
@@ -41,6 +41,31 @@ Your algorithm should have a linear runtime complexity. Could you implement it w
41
41
42
42
> 在 golang 中没有 Java 中的 ~ 位操作运算符,Java 中的 ~ 运算符代表按位取反。这个操作就想当于 golang 中的 ^ 运算符当做一元运算符使用的效果。
43
43
44
+ | (twos,ones)| xi| (twos'',ones')| ones'|
45
+ | :----:| :----:| :----:| :----:|
46
+ | 00| 0| 00| 0|
47
+ | 00| 1| 01| 1|
48
+ | 01| 0| 01| 1|
49
+ | 01| 1| 10| 0|
50
+ | 10| 0| 10| 0|
51
+ | 10| 1| 00| 0|
52
+
53
+ - 第一步,先将 ones -> ones'。通过观察可以看出 ones = (ones ^ nums[ i] ) & ^twos
54
+
55
+ | (twos,ones')| xi| twos'|
56
+ | :----:| :----:| :----:|
57
+ | 00| 0| 0|
58
+ | 01| 1| 0|
59
+ | 01| 0| 0|
60
+ | 00| 1| 1|
61
+ | 10| 0| 1|
62
+ | 10| 1| 0|
63
+
64
+
65
+ - 第二步,再将 twos -> twos'。这一步需要用到前一步的 ones。通过观察可以看出 twos = (twos ^ nums[ i] ) & ^ones。
66
+
67
+ --------------------------
68
+
44
69
这一题还可以继续扩展,在数组中每个元素都出现 5 次,找出只出现 1 次的数。那该怎么做呢?思路还是一样的,模拟一个五进制,5 次就会消除。代码如下:
45
70
46
71
// 解法一
Original file line number Diff line number Diff line change @@ -30,9 +30,9 @@ Your algorithm should have a linear runtime complexity. Could you implement it w
30
30
## 解题思路
31
31
32
32
- 这一题是第 136 题的加强版。这类题也可以扩展,在数组中每个元素都出现 5 次,找出只出现 1 次的数。
33
- - 本题中要求找出只出现 1 次的数,出现 3 次的数都要被消除。第 136 题是消除出现 2 次的数。这一题也会相当相同的解法,出现 3 次的数也要被消除。定义状态,00、10、01,这 3 个状态。当一个数出现 3 次,那么它每个位置上的 1 出现的次数肯定是 3 的倍数,所以当 1 出现 3 次以后,就归零清除。如何能做到这点呢?仿造` 三进制(00,10,01 ) ` 就可以做到。
33
+ - 本题中要求找出只出现 1 次的数,出现 3 次的数都要被消除。第 136 题是消除出现 2 次的数。这一题也会相当相同的解法,出现 3 次的数也要被消除。定义状态,00、10、01,这 3 个状态。当一个数出现 3 次,那么它每个位置上的 1 出现的次数肯定是 3 的倍数,所以当 1 出现 3 次以后,就归零清除。如何能做到这点呢?仿造` 三进制(00,01,10 ) ` 就可以做到。
34
34
- 变量 ones 中记录遍历中每个位上出现 1 的个数。将它与 A[ i] 进行异或,目的是:
35
- - 每位上两者都是 1 的,表示历史统计结果 ones 出现1次、A[ i] 中又出现1次 ,则是出现 2 次,需要进位到 twos 变量中。
35
+ - 每位上两者都是 1 的,表示历史统计结果 ones 出现1次、A[ i] 中又出现 1 次 ,则是出现 2 次,需要进位到 twos 变量中。
36
36
- 每位上两者分别为 0、1 的,加入到 ones 统计结果中。
37
37
- 最后还要 & ^twos ,是为了能做到三进制,出现 3 次就清零。例如 ones = x,那么 twos = 0,当 twos = x,那么 ones = 0;
38
38
- 变量 twos 中记录遍历中每个位上出现 1 ,2次 的个数。与 A[ i] 进行异或的目的和上述描述相同,不再赘述。
@@ -41,6 +41,31 @@ Your algorithm should have a linear runtime complexity. Could you implement it w
41
41
42
42
> 在 golang 中没有 Java 中的 ~ 位操作运算符,Java 中的 ~ 运算符代表按位取反。这个操作就想当于 golang 中的 ^ 运算符当做一元运算符使用的效果。
43
43
44
+ | (twos,ones)| xi| (twos'',ones')| ones'|
45
+ | :----:| :----:| :----:| :----:|
46
+ | 00| 0| 00| 0|
47
+ | 00| 1| 01| 1|
48
+ | 01| 0| 01| 1|
49
+ | 01| 1| 10| 0|
50
+ | 10| 0| 10| 0|
51
+ | 10| 1| 00| 0|
52
+
53
+ - 第一步,先将 ones -> ones'。通过观察可以看出 ones = (ones ^ nums[ i] ) & ^twos
54
+
55
+ | (twos,ones')| xi| twos'|
56
+ | :----:| :----:| :----:|
57
+ | 00| 0| 0|
58
+ | 01| 1| 0|
59
+ | 01| 0| 0|
60
+ | 00| 1| 1|
61
+ | 10| 0| 1|
62
+ | 10| 1| 0|
63
+
64
+
65
+ - 第二步,再将 twos -> twos'。这一步需要用到前一步的 ones。通过观察可以看出 twos = (twos ^ nums[ i] ) & ^ones。
66
+
67
+ --------------------------
68
+
44
69
这一题还可以继续扩展,在数组中每个元素都出现 5 次,找出只出现 1 次的数。那该怎么做呢?思路还是一样的,模拟一个五进制,5 次就会消除。代码如下:
45
70
46
71
// 解法一
You can’t perform that action at this time.
0 commit comments