LeetCode 67. Add Binary(二進制加法)

題目描述:

    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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章