字符串形式的二進制之和(Leetcode)
QUESTION:
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"
//分析:
設兩個待相加的字符串 爲 a 和 b, i = a.length()-1 j = b.length() - 1
字符串形式的二進制之和,重點在於關注進位問題,1+1會產生進位,爲方便處理,可以將字符串通過’0’,轉化爲 ascii碼形式 的 0 和1 ;從而相加減方便很多。
int tmp;
tmp = '1' - '0' 轉化爲 1
tmp = '0' - '0' 轉化爲 0
設置 int c = 0來處理進位問題,然後將 字符串二進制 問題 轉化爲 數學二進制相加 問題,
結束條件:只要還有未相加的位,或者 還有進位未處理,則相加不結束
用進制保留 位c去與 字符串a,b相加(轉化爲數字),如果該字符串已經遍歷完畢則 用 0來代替該字符串相加位
表示 爲
c += i >= 0 ? a[i--] - '0':0; //c與字符串a第i位相加
c += j >= 0 ? b[j--] - '0':0; //c與a相加後 與b的第j位相加
這其中 >=
的優先級最高,然後是 條件運算符 ?:
,最後是 +=
運算符
所以表達的意思是, 如果字符串a還未運算完畢,則取其 a[i–],否則用0來代替,b一樣
由於是二進制,所以相加結果 只能是 0,1或2,要轉換爲2 進制,壓入字符串中
c%2 表示相加後 該位 的和,c/2表示 相加後是否產生進位
s = char(c%2 + '0' ) + s
c = c/2;
完整代碼:
class Solution {
public:
string addBinary(string a, string b)
{
int i = a.length() - 1;
int j = b.length() - 1;
int c = 0;
string s = "";
while( i >=0 || j >= 0 || c == 1)
{
c += i >= 0 ? a[i--] - '0':0;
c += j >= 0 ? b[j--] - '0':0;
s = char(c%2 + '0') + s;
c = c/2;
}
return s;
}
};