题目
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例
输入: a = "11", b = "1"
输出: "100"
输入: a = "1010", b = "1011"
输出: "10101"
解决方案
错误方法:进制转换
将两个二进制数转换成十进制,加完以后再转回来。
这种方法属于取巧,俗称API战士,在刷题学习时不可取。
并且这种方法对字符串长度有要求,转换成的数字的长度不能大于Integer的最大长度。
leetCode官方提供的这种思想的题解代码都不能通过。
方案一:暴力解(倒序遍历)
该题属于(66.加一)的进阶,从加一变成加任意数
也可以理解为这道题就是在模拟两个二进制数相加
class Solution {
public String addBinary(String a, String b) {
String[] maxString, minString;
if(a.length() > b.length()) {
maxString = a.split("");
minString = b.split("");
} else {
maxString = b.split("");
minString = a.split("");
}
int diff = maxString.length - minString.length;
String result = "";
boolean flag = false;
// 后半段累加,倒序遍历
for (int length = minString.length-1; length >= 0; length--) {
int sum = Integer.parseInt(maxString[length+diff]) + Integer.parseInt(minString[length]) + (flag ? 1 : 0);
if(sum >= 2) {
flag = true;
result = sum % 2 + result;
} else {
flag = false;
result = sum + result;
}
}
// 前半段
for (int length = diff-1; length >= 0; length--) {
int sum = Integer.parseInt(maxString[length]) + (flag ? 1 : 0);
if(sum >= 2) {
flag = true;
result = sum % 2 + result;
} else {
flag = false;
result = sum + result;
}
}
// 最终结果可能需要再往前进一位
if(flag) {
result = "1" + result;
}
return result;
}
}
方案二:位运算
这种方法对位运算的掌握要求较高,先不写,等学完以后再加上去。