Descirption:
Given two binary strings, return their sum (also a binary string).
The input strings are both non-empty and contains only characters 1
or 0
.
Example 1:
Input: a = "11", b = "1" Output: "100"
Example 2:
Input: a = "1010", b = "1011" Output: "10101"
这道题要求输出用二进制加法得到的两数之和
二进制相加的算法和十进制其实是一样的,思路就是从末位开始相加,如果进位则该位归零(二进制归零,其他则获得余数),将该进位加入前方的数相加的过程中。
我们可以新建一个StringBuilder res,用来存放每一步获得的数字,将其附着在其后。注意由于需要从末位向前加,但向res中存放的顺序是从头至尾,因此在最后需要将得到的res再进行一次倒序,即可得到正确的答案。
在每次计算的时候,都需要考虑到是否有进位,创造一个变量flag存储进位,初始值为0,之后根据每一轮的加和进行修改。
在计算时,我们注意到输入的两数长度并不一定等长,在这里,我们可以考虑分步相加,创造一个变量sum,用于存该轮的相加之和,分别向sum中存储两个数目前的最末一位(如果其中一数已经到底终点则不需再加,只加另一个即可)以及上一轮的进位,将得到的sum%2,就是本轮该输出的值了;而进位则为sum/2。以此类推,直到将两数全部遍历完成。
在最后的时候,有一点容易遗留的是!!最后还可能有进位……所以最后还要检查进位是否为0,如果不为零则还要将该进位输出哦。
全部完成后将res倒序即可~
public String addBinary(String a, String b) {
int na = a.length()-1, nb = b.length()-1;
StringBuilder res = new StringBuilder();
int flag = 0;//记录之前的进位
while (na >= 0 || nb >= 0) {
int sum = flag;
if (na >= 0) {
sum += a.charAt(na)-'0';
na--;
}
if (nb >= 0) {
sum += b.charAt(nb)-'0';
nb--;
}
res.append(sum % 2);
flag = sum / 2;
}
if (flag != 0) {
res.append(flag);
}
return res.reverse().toString();
}
Runtime: 1 ms, faster than 99.93% of Java online submissions for Add Binary.
Memory Usage: 37 MB, less than 47.42% of Java online submissions for Add Binary.