題目描述:
Given two binary strings, return their sum (also a binary string).
For example, a = "11"
, b = "1"
, return "100"
.
分析:
題意:給定兩個二進制字符串(只包含0和1),返回它們相加之後的字符串結果。
思路:這是一道二進制加法題,我們採用普通的字符串加法思路。假設兩個字符串a、b的長度分別爲n1、n2,較小值min_n = min{n1, n2}。① 對於i∈n1 - 1→min_n和j∈n2 - 1→min_n,對a[i]、b[j]進行加法運算,用num表示更新之後的值,用carry表示當前位對前一位的進位。② 如果a字符串較長有剩餘,則對i∈min_n - 1→0進行加法運算;③ 如果b字符串較長有剩餘,則對j∈min_n - 1→0進行加法運算。
注意兩點:Ⅰ. 此處是二進制加法,故需要用位操作來完成;Ⅱ. 如果最後最高位進行加法運算之後有進位,那麼在答案最前面插入"1"。
時間複雜度爲O(max(n1, n2))。
代碼:
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
string addBinary(string a, string b) {
int n1 = a.length(), n2 = b.length();
// Exceptional Case:
if(n1 == 0){
return b;
}
if(n2 == 0){
return a;
}
string ans = "";
int num = 0, carry = 0;
int i = n1 - 1, j = n2 - 1;
while(i >= 0 && j >= 0){
num = (a[i] - '0') ^ (b[j] - '0') ^ carry;
carry = (a[i] - '0') + (b[j] - '0') + carry >= 2? 1: 0;
ans.insert(0, 1, num + '0');
i--;
j--;
}
while(i >= 0){
num = (a[i] - '0') ^ carry;
carry = (a[i] - '0') + carry >= 2? 1: 0;
ans.insert(0, 1, num + '0');
i--;
}
while(j >= 0){
num = (b[j] - '0') ^ carry;
carry = (b[j] - '0') + carry >= 2? 1: 0;
ans.insert(0, 1, num + '0');
j--;
}
if(carry){
ans.insert(0, 1, carry + '0');
}
return ans;
}
};