题目描述:
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1
和 0
。
示例 1:
输入: a = "1010", b = "1011"
输出: "10101"
示例 2:
输入: a = "10100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101"
b = "110101001011101110001111100110001010100001101011101010000011011011001011101111001100000011011110011"
输出: "110111101100010011000101110110100000011101000101011001000011011000001100011110011010010011000000000"
解题思路: 如果先把两个二进制字符串转换成数字,再求和,最后变成字符串的话,在本题中很容易出现溢出情况。
- 因为二进制字符串的加和是从右往左计算,所以先反转两个二进制字符串(使用StringBuffer提供的方法)。后面的步骤都基于反转后的字符串进行操作。
- 创建一个StringBuffer变量用以存放求和后的二进制字符串(后面简称为存值字符串)。(使用StringBuffer类,是因为此类的字符串相加操作效率很高)
- 将两个字符串变成相同的长度(在短的字符串后面加字符 ‘0’ ,直到两个字符串长度相同)。
- 创建一个字符变量来存放需要往后进位的值(flag),初始值为 ‘0’。从左向右,给两个字符串同一位置的字符以及 flag 进行 ”求和操作“ (满二进一)。如果求和后,需要向下一位进位,就把需要进位的值,存放在flag中。每次求和操作都要考虑 flag 的值。
- 完成两字符串最后一个字符的求和操作后。判断此时flag的值,如果flag 是 ‘1’,则还需要在存值字符串后面加上 ‘1’;
- 完成以上操作后,再将存值字符反转,然后转换尘为String类,并返回此。
代码实现:
class Solution {
public String addBinary(String a, String b) {
//反转字符串
StringBuffer s1 = new StringBuffer(a);
s1.reverse();
StringBuffer s2 = new StringBuffer(b);
s2.reverse();
//将两个字符串变成长度相同。
if (s1.length() > s2.length()) {
int n = s1.length() - s2.length();
for (int i = 0; i < n; i++) {
s2.append('0');
}
}else if (s1.length() < s2.length()) {
int n = s2.length() - s1.length();
for (int i = 0; i < n; i++) {
s1.append('0');
}
}
//进行两个字符串的求和操作
StringBuffer stringBuffer = new StringBuffer("");
int i = 0;
char flag = '0'; //用来存放进位值的字符变量
while (i < s1.length() && i < s2.length()) {
if (flag == '0') {
if (s1.charAt(i) == s2.charAt(i) && s1.charAt(i) == '1') {
flag = '1';
stringBuffer.append('0');
}else if (s1.charAt(i) == s2.charAt(i) && s1.charAt(i) == '0') {
stringBuffer.append('0');
}else {
stringBuffer.append('1');
}
} else {
if (s1.charAt(i) == s2.charAt(i) && s1.charAt(i) == '1') {
flag = '1';
stringBuffer.append('1');
}else if (s1.charAt(i) == s2.charAt(i) && s1.charAt(i) == '0'){
flag = '0';
stringBuffer.append('1');
}else {
flag = '1';
stringBuffer.append('0');
}
}
i++;
}
if (flag == '1') {
stringBuffer.append(flag);
}
stringBuffer.reverse();
return stringBuffer.toString();
}
}