題目描述如下:
Given two binary strings, return their sum (also a binary string).
The input strings are both non-empty and contains only characters 1 or 0.
Example 1:
Input: a = "11", b = "1"
Output: "100"
Example 2:
Input: a = "1010", b = "1011"
Output: "10101"
個人思路:
我的思路就是最簡單的我們用筆算二進制加法的思路,讓兩個數尾端對齊,然後設置一個臨時變量用作爲判斷上一輪加法中是否有進位。然後以從尾端開始遍歷的方式開始來進行遍歷,循環次數是其中較短的字符串的長度。
遍歷完成之後,我們就需要處理比較長的一個字符串中還沒有進行相加的數,這個時候就把還沒有處理的數與進位進行相加,方法類似於之前的循環。
代碼:
string addBinary(string a, string b) {
string sum("");
bool flag = false; //標誌是否需要進位
int i,j; //記錄下標
for(i = a.length() - 1, j = b.length() - 1; i >= 0 && j >= 0; --i, --j){
if(a[i] != b[j]) {//不相等則相加必爲1,然後再處理進位
if(flag) {//有進位則結果爲2,置進位爲1,添0
flag = true;
sum.append("0");
}
else {//無進位則結果爲1,置進位爲0,添1
flag = false;
sum.append("1");
}
}
else if(a[i] == '1'){//相等且爲2
if(flag) {//有進位則結果爲3,置進位爲1,添1
flag = true;
sum.append("1");
}
else {//無進位則結果爲2,置進位爲1,添0
flag = true;
sum.append("0");
}
}
else{
if(flag) {//有進位則結果爲1,置進位爲0,添1
flag = false;
sum.append("1");
}
else {//無進位則結果爲0,置進位爲0,添0
flag = false;
sum.append("0");
}
}
}
while(i-- >= 0 && flag){ //若a有剩餘則依次與進位相加,當無進位時只需要把剩下的字符串直接接在前端即可
if(a[i+1] == '1') sum.append("0");
else {
sum.append("1");
flag = false;
}
}
while(j-- >= 0 && flag){//若b有剩餘則依次與進位相加,此while循環與上一個while循環只會執行一個
if(b[j+1] == '1') sum.append("0");
else {
sum.append("1");
flag = false;
}
}
if(flag) sum.append("1"); //判斷最前端是否還有進位,如果有的話再加1,如果執行了這一步下面的判斷語句則不會執行
reverse(sum.begin(),sum.end()); //上面的計算存儲是一個小端存儲,因此需要反轉字符串
if(i+1 >= 0){
sum = a.substr(0,i+2) + sum;
}
else if(j+1 >= 0){
sum = b.substr(0,j+2) + sum;
}
return sum;
}