输入 a = "11",b = "1"
输出 "100"
解析:
我们不妨把他们两个的长度补成一致,即"011"与"001"
1) 1 与 1 与 对应进位相加 = 10 => 这个位上面的结果是0,进位是1[注意,一开始的进位为0]
2) 1 与 0 与 对应进位相加 = 10 => 这个位置上的结果是0,进位是1
3) 0 与 0 与 对应进位相加 = 1 => 这个位置上的结果为1,进位为0
输入 a = "11",b = "1"
输出 "100"
解析:
我们不妨把他们两个的长度补成一致,即"011"与"001"
1) 1 与 1 与 对应进位相加 = 10 => 这个位上面的结果是0,进位是1[注意,一开始的进位为0]
2) 1 与 0 与 对应进位相加 = 10 => 这个位置上的结果是0,进位是1
3) 0 与 0 与 对应进位相加 = 1 => 这个位置上的结果为1,进位为0
输入 a = "1010",b = "1011"
输出 "10101"
解析:
我们不妨把他们两个的长度补成一致,即"01010"与"01011"
1) 1 与 0 与 对应进位相加 = 1 => 这个位上面的结果是1,进位是0[注意,一开始的进位为0]
2) 1 与 1 与 对应进位相加 = 10 => 这个位上面的结果是0,进位是1
3) 0 与 0 与 对应进位相加 = 1 => 这个位上面的结果是1,进位是0
4) 1 与 1 与 对应进位相加 = 10 => 这个位上面的结果是0,进位是1
5) 0 与 0 与 对应进位相加 = 1 => 这个位上面的结果是1,进位是0
class Solution {
public String addBinary(String a, String b) {
// carry 该变量用于记录进位的大小
var carry = 0;
// len 该变量用于记录较长的字符串的长度,作用请看解析F
var len = Math.max(a.length(),b.length());
// res 该变量用于拼接结果
var res = new StringBuilder();
// i的初始化,作用请看解析S
for (int i = 0; i < len; i++) {
// 代码思想请看解析T
carry += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0;
carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0;
res.append((char) (carry % 2 + '0'));
carry /= 2;
}
// 如果超过了最长长度,还有进位,即示例2,我们需要再拿一个位补1
if (carry > 0) {
res.append("1");
}
// 将结果翻转即可
return res.reverse().toString();
}
}
len记录较长的字符串长度,就可以实现将他们两个字符串的长度补成一致i = len - 1呢?
i = len - 1,如果有一个较短的字符串会直接越界i = 0
i < a.length()或i < b.length()可以直接看出是否越界的情况i < a.length,说明没有越界,由于carry是int类型,所以我们对其取到的字符-'0'取到其对应的整数数字,将整数数字叠加到carryi > a.length,说明越界了,根据示例,我们需要在不满长度的地方补够对应的长度,补的地方数字为0,所以直接将0叠加到carry即可carry%2 + '0'的结果强制类型转换成char添加即可
%2
{0,1},所以要%2carry/=2
1 + 1 = 10 进位 = 1,换算成10进制是 1 + 1 = 2 , 2 / 2 = 1,刚好拿到其进位该算法被称为模拟法,是官方解法的法一,法二涉及到位运算,待我把位运算的前置算法题目都刷完,再给大家带来这道题的第二种解法