二进制求和
给你两个二进制字符串
a
和b
,以二进制字符串的形式返回它们的和。示例 1:
输入:a = "11", b = "1" 输出:"100"示例 2:
输入:a = "1010", b = "1011" 输出:"10101"
class Solution {
public String addBinary(String a, String b) {
StringBuffer s = new StringBuffer();
int maxLength = Math.max(a.length(), b.length());
int carry = 0;
for (int i = 0; i < maxLength; i++) {
carry += i < a.length() ? (a.charAt(a.length() - i - 1) - '0') : 0;
carry += i < b.length() ? (b.charAt(b.length() - i - 1) - '0') : 0;
s.append((char)(carry % 2 + '0'));
carry = carry / 2;
}
if (carry == 1) {
s.append('1');
}
s.reverse();
return s.toString();
}
}
N进制字符串的求和,注意以下几点:
1. 不要过于考虑字符串越界的情况。比如二进制字符串求和,最终结果的长度必然是同最长字符串相等或者最长字符串的长度加一。因而,我们可以明确循环次数必须是两个字符串的最长长度。
2. 计算是否进位的条件,是利用字符串的ascii值来判断还是利用进制的特点。考虑代码的简洁,通过进制的特点来判断进位是最简单的。对于字符串求和,我们往往会考虑越界情况,但如果使用进制作为判断条件,我们只需要简单加法和一些逻辑就可以完成这个问题。我们可以使用三目运算符,如果当前位置超过字符串长度,返回0,否则返回当前位置的字符 - '0'。使用进制的好处从直观角度看,体现不出来。但如果使用ASCII值判断的话,对于进制情况,对应三者 '0' + '1' + 1 或 '1' + '1' + 0 或 '1' + '1' + 1 , 此外对于这种情况需要考虑是否需要进位, 我们给算每个条件得出的ASCII值, 非常麻烦。考虑N进制的情况,这些都需要修改。反之,计算出每一位的carry值,模运算得出当前位置的字符,除2得到上一位进制的值,是很方便的。
3. 循环结束后,其实我们的得到的结果是完全相反的。因而我们需要考虑反转字符串,才可得到最终结果。