1. 程式人生 > >(String) leetcode 67. Add Binary

(String) leetcode 67. Add Binary

only bin 運用 字符 inpu dbi 進一步 輔助 。。

Given two binary strings, return their sum (also a binary string).

The input strings are both non-empty and contains only characters 1or 0.

Example 1:

Input: a = "11", b = "1"
Output: "100"

Example 2:

Input: a = "1010", b = "1011"
Output: "10101"

---------------------------------------------------------------------------------------------------------------------------------------------

這個題說的是將兩個以字符串形式的二進制進行二進制加法運算後得到的結果,結果是string形式。

1)

先從最右端遍歷,一個一個相加,可以用一個輔助變量來作為要進位的數,如果其中一個已經遍歷完,而另一個還沒遍歷完,再繼續遍歷這個沒有遍歷完的字符串(並不是與另一個字符串二進制對應的數相加)。

用stringstream來將一個int類型的數轉換為string類型,不過花的時間可能會比較長。

C++代碼:

class Solution {
public:
    string addBinary(string a, string b) {
        int len1 = a.length();
        
int len2 = b.length(); int i = len1-1,j = len2-1; int carry = 0; //進位。 string str = ""; while(true){ if(i < 0 || j < 0){ break; } int num1 = a[i] - 0; int num2 = b[j] - 0; int sum = num1 + num2 + carry; stringstream ss;
string s; ss << (sum%2); ss >> s; str = s + str; carry = sum / 2; //向前進1或進0。 i--; j--; } if(j >= 0){ while(j >= 0){ int num = b[j] - 0; int sum = num + carry; stringstream ss; string s; ss << (sum%2); ss >> s; str = s + str; carry = sum / 2; j--; } } if(i >= 0){ while(i >= 0){ int num = a[i] - 0; int sum = num + carry; stringstream ss; string s; ss << (sum%2); ss >> s; str = s + str; carry = sum / 2; i--; } } if(carry > 0){ stringstream ss; string s; ss << carry; ss >> s; str = s + str; } return str; } };

2)

也可以直接用char(num + ‘0‘),將一個int類型的數轉換為char類型。這樣會大大提升速度。

C++代碼:

class Solution {
public:
    string addBinary(string a, string b) {
        int len1 = a.length();
        int len2 = b.length();
        int i = len1-1,j = len2-1;
        int carry = 0;
        string str = "";
        while(true){
            if(i < 0 || j < 0){
                break;
            }
            int num1 = a[i] - 0;
            int num2 = b[j] - 0;
            int sum = num1 + num2 + carry;
            str = char(sum%2 + 0) + str;
            carry = sum / 2;
            i--;
            j--;
        }
        if(j >= 0){
            while(j >= 0){
                int num = b[j] - 0;
                int sum = num + carry;
                str = char(sum%2 + 0) + str;
                carry = sum / 2;
                j--;
            }
        }
        if(i >= 0){
            while(i >= 0){
                int num = a[i] - 0;
                int sum = num + carry;
                str = char(sum % 2 + 0) + str;
                carry = sum / 2;
                i--; 
            }
        }
        if(carry > 0){
            str = char(carry + 0) + str;
        }
        return str;
    }
};

3)

還可以吧上面的代碼進一步優化,縮短代碼行。要熟練地運用三元表達式。

C++代碼:

class Solution {
public:
    string addBinary(string a, string b) {
        int len1 = a.length();
        int len2 = b.length();
        int carry = 0;
        string str = "";
        for(int i = len1 - 1,j = len2 - 1;i >= 0 || j >= 0;i--,j--){
            int num1 = i >= 0 ? a[i] - 0 : 0;
            int num2 = j >= 0 ? b[j] - 0 : 0;
            int sum = num1 + num2 + carry;
            str = char(sum % 2 + 0) + str;
            carry = sum / 2;
        }
        if(carry > 0){
            str = char(carry + 0) + str;
        }
        return str;
    }
};

4)

這個char還可以用to_string()代替,用to_string(num),這個是<string> 內置的。不過運行速度會變慢。。。。

C++代碼:

class Solution {
public:
    string addBinary(string a, string b) {
        int len1 = a.length();
        int len2 = b.length();
        int carry = 0;
        string str = "";
        for(int i = len1 - 1,j = len2 - 1;i >= 0 || j >= 0;i--,j--){
            int num1 = i >= 0 ? a[i] - 0 : 0;
            int num2 = j >= 0 ? b[j] - 0 : 0;
            int sum = num1 + num2 + carry;
            str = to_string(sum % 2) + str;
            carry = sum / 2;
        }
        if(carry > 0){
            str = to_string(carry) + str;
        }
        return str;
    }
};

(String) leetcode 67. Add Binary