題目描述
給定兩個二進制字符串,返回他們的和(用二進制表示)
輸入爲非空字符串且只包含數字 1 和 0。
示例 1:
輸入: a = “11”, b = “1”
輸出: “100”
示例 2:
輸入: a = “1010”, b = “1011”
輸出: “10101”
思路
將字符串轉化爲int數組,數組的長度爲兩個字符串最長長度+1(長度+1的原因是考慮到最高位進位的情況),然後將a,b字符串對應的數組按右對齊進行賦值,如“111”和“1”賦值爲[0,1,1,1]和[0,0,1,1],然後從後向前逐位進行相加,滿2進位。最後,將得到的結果轉化爲字符串。注意去掉結果前面的0,如果結果全爲0,則返回字符串 “0”。注意: a b 字符串中全爲0情況,這種情況下 結果爲全爲0,返回的數組爲0。
代碼
class Solution {
/**
* 將字符串轉化爲int數組,數組的長度爲兩個字符串最長長度+1(長度+1的原因是考慮到最高位進位的情況),然後將a,b字符串對應的數組
* 按右對齊進行賦值,如“111”和“1”賦值爲[0,1,1,1]和[0,0,1,1],然後從後向前逐位進行相加,滿2進位。
* 最後,將得到的結果轉化爲字符串。注意去掉結果前面的0,如果結果全爲0,則返回字符串 "0"。
* 注意: a b 字符串中全爲0情況,這種情況下 結果爲全爲0,返回的數組爲0。
*/
public String addBinary(String a, String b) {
char[] a2char = a.toCharArray();
char[] b2char = b.toCharArray();
StringBuilder sb = new StringBuilder();
//得到int數組最大的長度,用於後續的循環,多加一位用於進位的情況
int maxLength = a.length() < b.length() ? b.length() : a.length() + 1;
int maxArrayLength = maxLength + 1;
int[] a2int = new int[maxArrayLength];
int[] b2int = new int[maxArrayLength];
//將字符串a轉化爲int數組
for(int i = a.length() - 1; i >= 0; -- i){
if(a2char[i] == '1'){
a2int[-- maxArrayLength] = 1;
}else if(a2char[i] == '0'){
a2int[-- maxArrayLength] = 0;
}
}
maxArrayLength = maxLength + 1;
//將字符串b轉化爲int數組
for(int i = b.length() - 1; i >= 0; -- i){
if(b2char[i] == '1'){
b2int[-- maxArrayLength] = 1;
}else if(b2char[i] == '0'){
b2int[-- maxArrayLength] = 0;
}
}
maxArrayLength = maxLength + 1;
//兩數組相加
for(int i = maxArrayLength - 1; i >= 0; -- i){
if((a2int[i] + b2int[i]) > 1){
int carry = (a2int[i] + b2int[i]) / 2;
int remainder = (a2int[i] + b2int[i]) % 2;
a2int[i] = remainder;
if(carry > 0){
a2int[i - 1] += carry;
}
}else{
a2int[i] += b2int[i];
}
}
//去掉計算結果中左邊的0
int start = a2int.length;
for(int i = 0; i < a2int.length; ++ i){
if(a2int[i] == 0){
continue;
}else{
start = i;
break;
}
}
//將計算結果轉換爲字符串
if(start == a2int.length){
sb.append(0);
}else{
for(int i = start; i < a2int.length; ++ i){
sb.append(a2int[i]);
}
}
return sb.toString();
}
}