二进制求和[LeetCode]

126 阅读1分钟

题目描述

思路

从后向前遍历每一个字符串的每一个字符,直到走完所有位,比如两个字符串分别是a="101" 和 b="11"
则第一次取a的最后一位1和b的最后一位1,初始没有进位,则进位为0,相加为2,变为0,进一位,总结起来就是:
每个字符串各取一位相加,然后再加上进位(如果有为1,没有为0),得到的值设为x,x / 2即为新的进位,x % 2即为相加之后当前位更新之后的值。

代码实现

class Solution {
public:
    string addBinary(string a, string b) {
        int a_len = a.size() - 1, b_len = b.size() - 1;
        int carry = 0; // 初始进位值
        string res;
        while (a_len >= 0 || b_len >= 0) {
            // 分别从后向前遍历每一个字符串的对应每一个字符
            // a_len b_len 对应字符串的下标,最大即为size() - 1,最小为0
            int sum = carry;
            if (a_len >= 0) {
                sum += a[a_len--] - '0'; // 注意这里一定要--,不然死循环
            }
            if (b_len >= 0) {
                sum += b[b_len--] - '0';
            }
            carry = sum / 2;
            // 不要写成res.append(sum % 2 == 0 ? "0" : "1"),否则需要倒转过来
            res = (sum % 2 == 0 ? "0" : "1") + res; 
        }
        
        // 考虑到最后可能还有进位,需要额外的1来填充
        if (carry == 1) {
            res = "1" + res;
        }
        return res;
    }
};