leetcode 67. 二進位制求和
阿新 • • 發佈:2018-12-24
給定兩個二進位制字串,返回他們的和(用二進位制表示)。
輸入為非空字串且只包含數字 1
和 0
。
示例 1:
輸入: a = "11", b = "1" 輸出: "100"
示例 2:
輸入: a = "1010", b = "1011" 輸出: "10101"
解法一:
class Solution { public: string addBinary(string a, string b) { string c; int n = a.size(); int m = b.size(); int l = max(n, m); bool car = 0; if (n > m) { for (int i = 0; i < n - m; ++i) b.insert(b.begin(), '0');//在其中一個字串前面補0使兩個字串等長 } else if (n < m) { for (int i = 0; i < m - n; ++i) a.insert(a.begin(), '0'); } for (int i = l - 1; i >= 0; --i) { int t = 0; if (car) t = (a[i] - '0') + (b[i] - '0') + 1; else t = (a[i] - '0') + (b[i] - '0');//兩個char型別運算得到int型別 if (t == 0) { c.insert(c.begin(), '0'); car = 0; } else if (t == 1) { c.insert(c.begin(), '1'); car = 0; } else if (t == 2) { c.insert(c.begin(), '0'); car = 1; } else if (t == 3) { c.insert(c.begin(), '1'); car = 1; } } if (car) c.insert(c.begin(), '1'); return c; } };
演算法思想:首先通過補0使兩個字串等長便於後面的運算,然後分四種情況改變c和進位car,最後判斷迴圈結束後的進位car是否為1,為1則在c前面插入一位1。
解法二:
把每一步計算結果順序存入ret,再將ret反轉。class Solution { public: string addBinary(string a, string b) { string ret; int la = a.length(); int lb = b.length(); int lmax = max(la, lb); int add = '0'; for (int i = 0; i < lmax; i++) { char ca = la > i ? a[la-i-1] : '0'; char cb = lb > i ? b[lb-i-1] : '0'; char s = (ca == cb ? '0' : '1'); char sj = (s == add ? '0' : '1'); if (ca == '1' && cb == '1' || s == '1' && add == '1') { add = '1'; } else { add = '0'; } ret += sj; } if (add == '1') { ret += add; } reverse(ret.begin(), ret.end()); return ret; } };