LeetCode LCR 002. 二进制求和
题目描述
思路分析
解法一:模拟加法(推荐)
核心思路:
- 从字符串末尾开始逐位相加,维护进位
carry。- 当前位结果为
sum % 2,进位为sum / 2。- 扫描结束后若仍有进位,补到最高位。
复杂度分析:
- 时间复杂度:O(n),其中 n 表示较长字符串长度。
- 空间复杂度:O(n),其中 n 表示结果字符串长度。
class Solution {
public String addBinary(String a, String b) {
int i = a.length() - 1;
int j = b.length() - 1;
int carry = 0;
StringBuilder sb = new StringBuilder();
// 从低位到高位逐位相加
while (i >= 0 || j >= 0 || carry != 0) {
int x = i >= 0 ? a.charAt(i) - '0' : 0;
int y = j >= 0 ? b.charAt(j) - '0' : 0;
int sum = x + y + carry;
sb.append(sum & 1);
carry = sum >> 1;
i--;
j--;
}
return sb.reverse().toString();
}
}
func addBinary(a string, b string) string {
i := len(a) - 1
j := len(b) - 1
carry := 0
buf := make([]byte, 0)
// 从低位到高位逐位相加
for i >= 0 || j >= 0 || carry != 0 {
x := 0
y := 0
if i >= 0 {
x = int(a[i] - '0')
}
if j >= 0 {
y = int(b[j] - '0')
}
sum := x + y + carry
buf = append(buf, byte(sum&1)+'0')
carry = sum >> 1
i--
j--
}
// 结果目前是逆序
for l, r := 0, len(buf)-1; l < r; l, r = l+1, r-1 {
buf[l], buf[r] = buf[r], buf[l]
}
return string(buf)
}
相似题目
| 题目 | 难度 | 考察点 |
|---|---|---|
| 415. 字符串相加 | 简单 | 字符串模拟 |
| 43. 字符串相乘 | 中等 | 字符串模拟 |
| 2. 两数相加 | 中等 | 链表、模拟 |
| 989. 数组形式的整数加法 | 简单 | 数组模拟 |
| 66. 加一 | 简单 | 数组模拟 |
本博客所有文章除特别声明外,均采用
CC BY-NC-SA 4.0
许可协议,转载请注明出处!