File tree 5 files changed +53
-24
lines changed
5 files changed +53
-24
lines changed Original file line number Diff line number Diff line change 113
113
1 . [ 错误的集合] ( /solution/0600-0699/0645.Set%20Mismatch/README.md )
114
114
1 . [ 二进制中 1 的个数] ( /lcof/面试题15.%20二进制中1的个数/README.md )
115
115
1 . [ 计数质数] ( /solution/0200-0299/0204.Count%20Primes/README.md )
116
+ 1 . [ 不用加减乘除做加法] ( /lcof/面试题65.%20不用加减乘除做加法/README.md )
116
117
117
118
### 栈和队列
118
119
Original file line number Diff line number Diff line change 22
22
23
23
<!-- 这里可写通用的实现逻辑 -->
24
24
25
+ 两数字的二进制形式 a,b ,求和 s = a + b ,a(i)、b(i) 分别表示 a、b 的第 i 个二进制位。一共有 4 种情况:
26
+
27
+ | a(i) | b(i) | 不进位的和 | 进位 |
28
+ | ---- | ---- | ---------- | ---- |
29
+ | 0 | 0 | 0 | 0 |
30
+ | 0 | 1 | 1 | 0 |
31
+ | 1 | 0 | 1 | 0 |
32
+ | 1 | 1 | 0 | 1 |
33
+
34
+ 观察可以发现,“不进位的和”与“异或运算”有相同规律,而进位则与“与”运算规律相同,并且需要左移一位。
35
+
25
36
- 对两数进行按位 ` ^ ` 异或运算,得到不进位的和;
26
37
- 对两数进行按位 ` & ` 与运算,然后左移一位,得到进位;
27
- - 循环,直至进位为 0。
38
+ - 问题转换为求:“不进位的数 + 进位” 之和;
39
+ - 循环,直至进位为 0,返回不进位的数即可(也可以用递归实现)。
28
40
29
41
<!-- tabs:start -->
30
42
@@ -50,21 +62,32 @@ class Solution:
50
62
51
63
<!-- 这里可写当前语言的特殊实现逻辑 -->
52
64
65
+ 迭代:
66
+
53
67
``` java
54
68
class Solution {
55
69
public int add (int a , int b ) {
56
- int sum = 0 , carry = 0 ;
57
70
while (b != 0 ) {
58
- sum = a ^ b;
59
- carry = (a & b) << 1 ;
60
- a = sum;
61
- b = carry;
71
+ int s = a ^ b;
72
+ b = (a & b) << 1 ;
73
+ a = s;
62
74
}
63
75
return a;
64
76
}
65
77
}
66
78
```
67
79
80
+ 递归:
81
+
82
+ ``` java
83
+ class Solution {
84
+ public int add (int a , int b ) {
85
+ if (b == 0 ) return a;
86
+ return add(a ^ b, (a & b) << 1 );
87
+ }
88
+ }
89
+ ```
90
+
68
91
### ** JavaScript**
69
92
70
93
``` js
@@ -74,12 +97,20 @@ class Solution {
74
97
* @return {number}
75
98
*/
76
99
var add = function (a , b ) {
77
- if (a === 0 ) return b ;
78
- return add ((a & b) << 1 , a ^ b );
100
+ if (b == 0 ) return a ;
101
+ return add (a ^ b, (a & b) << 1 );
79
102
};
80
- // (a & b) << 1 是 进位和
81
- // a ^ b 是不进位和
82
- // 两者相加得结果,由于本题禁止 + 号,所以递归
103
+ ```
104
+
105
+ ### ** Go**
106
+
107
+ ``` go
108
+ func add (a int , b int ) int {
109
+ if b == 0 {
110
+ return a
111
+ }
112
+ return add (a ^ b, (a & b) << 1 )
113
+ }
83
114
```
84
115
85
116
### ** ...**
Original file line number Diff line number Diff line change
1
+ func add (a int , b int ) int {
2
+ if b == 0 {
3
+ return a
4
+ }
5
+ return add (a ^ b , (a & b ) << 1 )
6
+ }
Original file line number Diff line number Diff line change 1
1
class Solution {
2
2
public int add (int a , int b ) {
3
- int sum = 0 , carry = 0 ;
4
- while (b != 0 ) {
5
- sum = a ^ b ;
6
- carry = (a & b ) << 1 ;
7
- a = sum ;
8
- b = carry ;
9
- }
10
- return a ;
3
+ if (b == 0 ) return a ;
4
+ return add (a ^ b , (a & b ) << 1 );
11
5
}
12
6
}
Original file line number Diff line number Diff line change 4
4
* @return {number }
5
5
*/
6
6
var add = function ( a , b ) {
7
- if ( a === 0 ) return b ;
8
- return add ( ( a & b ) << 1 , a ^ b ) ;
7
+ if ( b == 0 ) return a ;
8
+ return add ( a ^ b , ( a & b ) << 1 ) ;
9
9
} ;
10
- // (a & b) << 1 是 进位和
11
- // a ^ b 是不进位和
12
- // 两者相加得结果,由于本题禁止 + 号,所以递归
You can’t perform that action at this time.
0 commit comments