Skip to content

Commit b626539

Browse files
committed
feat: update solutions to lcof problem: No.065
1 parent 9b5eb0f commit b626539

File tree

5 files changed

+53
-24
lines changed

5 files changed

+53
-24
lines changed

README.md

+1
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@
113113
1. [错误的集合](/solution/0600-0699/0645.Set%20Mismatch/README.md)
114114
1. [二进制中 1 的个数](/lcof/面试题15.%20二进制中1的个数/README.md)
115115
1. [计数质数](/solution/0200-0299/0204.Count%20Primes/README.md)
116+
1. [不用加减乘除做加法](/lcof/面试题65.%20不用加减乘除做加法/README.md)
116117

117118
### 栈和队列
118119

lcof/面试题65. 不用加减乘除做加法/README.md

+42-11
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,21 @@
2222

2323
<!-- 这里可写通用的实现逻辑 -->
2424

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+
2536
- 对两数进行按位 `^` 异或运算,得到不进位的和;
2637
- 对两数进行按位 `&` 与运算,然后左移一位,得到进位;
27-
- 循环,直至进位为 0。
38+
- 问题转换为求:“不进位的数 + 进位” 之和;
39+
- 循环,直至进位为 0,返回不进位的数即可(也可以用递归实现)。
2840

2941
<!-- tabs:start -->
3042

@@ -50,21 +62,32 @@ class Solution:
5062

5163
<!-- 这里可写当前语言的特殊实现逻辑 -->
5264

65+
迭代:
66+
5367
```java
5468
class Solution {
5569
public int add(int a, int b) {
56-
int sum = 0, carry = 0;
5770
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;
6274
}
6375
return a;
6476
}
6577
}
6678
```
6779

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+
6891
### **JavaScript**
6992

7093
```js
@@ -74,12 +97,20 @@ class Solution {
7497
* @return {number}
7598
*/
7699
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);
79102
};
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+
}
83114
```
84115

85116
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
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 numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
class Solution {
22
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);
115
}
126
}

lcof/面试题65. 不用加减乘除做加法/Solution.js

+2-5
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@
44
* @return {number}
55
*/
66
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);
99
};
10-
// (a & b) << 1 是 进位和
11-
// a ^ b 是不进位和
12-
// 两者相加得结果,由于本题禁止 + 号,所以递归

0 commit comments

Comments
 (0)