LeetCode 67.二进制求和

67.二进制求和

题目链接

题目分析
本题采用模拟法解决,首先确定二进制加法的基本法则:

1 + 1 = 10
1 + 0 = 01
0 + 0 = 00

所以我们可以从两个字符串的最后一位开始遍历,按照上面的法则运算,为了表示进位,我们需要定义一个进位符flag,有进位时,令flag = 1;没有进位时,令flag = 0

同时,为了方便运算,我们可以令两个字符串等长,其实操作也很简单,只要在短的字符串前面加0字符即可。

int len_a = a.length();
int len_b = b.length();
if (len_a < len_b) swap(a, b);
while (b.length() < a.length()) {
    b = '0' + b;
}

然后定位进位符flag = 0, 从i = a.length() - 1开始遍历,遍历的情况:

  • a[i] = 1 && b[i] = 1
    • 如果flag = 1,令temp = 1;
    • 如果flag = 0,令temp = 0, flag = 1;
  • a[i] = 0 && b[i] = 0
    • 如果flag = 1,令temp = 1, flag = 0;
    • 如果flag = 0,令temp = 0;
  • a[i] = 1 || b[i] = 1
    • 如果flag = 1,令temp = 0;
    • 如果flag = 0,令temp = 1;
  • 一轮遍历结束,res = temp + res;

遍历结束后,如果flag = 1,在结果前加字符1

题目解答

class Solution {
public:
    string addBinary(string a, string b) {
        int len_a = a.length();
        int len_b = b.length();
        if (len_a < len_b) swap(a, b);
        while (b.length() < a.length()) {
            b = '0' + b;
        }
        
        string res;
        int it = a.length();
        int flag = 0;
        for (int i = it - 1; i >= 0; i--) {
            char temp;
            if (a[i] == '1' && b[i] == '1') {
                if (flag == 1) temp = '1';
                else {
                    temp = '0';
                    flag = 1;
                }
            } else if (a[i] == '0' && b[i] == '0') {
                if (flag == 1) {
                    temp = '1';
                    flag = 0;
                }else temp = '0';
            } else if (a[i] == '1' || b[i] == '1') {
                if (flag == 1) {
                    temp = '0';
                }else temp = '1';
            }
            // printf("%c %c %d %c\n", a[i], b[i], flag, temp);
            res = temp + res;
        }
        if (flag == 1) res = '1' + res;

        return res;
    }
};

你可能感兴趣的:(LeetCode 67.二进制求和)