给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1
和 0
。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
public class AddBinary {
public static void main(String[] args) {
String a = "1010";
String b = "1011";
String result = addBinary2(a, b);
System.out.println(result);
}
/**
* 方法一:正向求解
* @param a
* @param b
* @return
*/
public static String addBinary1(String a, String b) {
//若字符串a的长度小于b的长度,两个字符串交换
if (a.length() < b.length()){
String temp = a;
a = b;
b = temp;
}
int lengthA = a.length() - 1;
int lengthB = b.length() - 1;
//进位
int carries = 0;
String result = "";
//先根据短字符串的长度依次计算
while (lengthB >= 0){
//减去'0'防止字符强转成int时值发生变化 例如'1'转换成int类型就变成49了
int sum = (a.charAt(lengthA) - '0') + (b.charAt(lengthB) - '0') + carries;
result = String.valueOf(sum % 2) + result;
carries = sum / 2;
lengthA--;
lengthB--;
}
//再根据长字符串的长度一次计算
while (lengthA >= 0){
int sum = (a.charAt(lengthA) - '0') + carries;
result = String.valueOf(sum % 2) + result;
carries = sum / 2;
lengthA--;
}
if (carries == 1){
result = "1" + result;
}
return result;
}
/**
* 方法二:反转
* @param a
* @param b
* @return
*/
public static String addBinary2(String a, String b) {
int lenA = a.length() - 1;
int lenB = b.length() - 1;
StringBuffer sb = new StringBuffer();
//进位
int carries = 0;
while (lenA >= 0 || lenB >= 0){
int x = (lenA >= 0)?a.charAt(lenA) - '0':0;
int y = (lenB >= 0)?b.charAt(lenB) - '0':0;
int sum = x + y;
carries = sum / 2;
sb.append(sum % 2);
lenA--;
lenB--;
}
if (carries > 0){
sb.append(carries);
}
return sb.reverse().toString();
}
}