知识点

模拟

思路

模拟加法的进位过程,翻转两个字符串,从前往后进行加法,同时维护一个进位carry。每一次把当前位记录到结果字符串中。

最后反转结果字符串即可。

时间复杂度 O(n)

AC Code (c++)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param a string字符串 
     * @param b string字符串 
     * @return string字符串
     */
    string addBinary(string a, string b) {
        reverse(a.begin(), a.end());
        reverse(b.begin(), b.end());
        string res;
        int i = 0, n = a.size(), m = b.size();
        int carry = 0;
        while (i < n and i < m) {
            auto k = (a[i] - '0' + b[i] - '0' + carry);
            res.push_back('0' + (k & 1));
            carry = k >> 1;
            i ++;
        }
        while (i < n) {
            auto k = (a[i] - '0' + carry);
            res.push_back('0' + (k & 1));
            carry = k >> 1;
            i ++;
        }
        while (i < m) {
            auto k = (b[i] - '0' + carry);
            res.push_back('0' + (k & 1));
            carry = k >> 1;
            i ++;
        }
        while (carry) {
            res.push_back('0' + (carry & 1));
            carry >>= 1;
        }
        reverse(res.begin(), res.end());
        return res;
    }
};