力扣第六十七题-二进制求和

307 阅读2分钟

「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

前言

力扣第六十七题 二进制求和 如下所示:

给你两个二进制字符串,返回它们的和(用二进制表示)。

输入为 非空 字符串且只包含数字 1 和 0

示例 1:

输入: a = "11", b = "1"
输出: "100"

示例 2:

输入: a = "1010", b = "1011"
输出: "10101"

一、思路

这一题中有两个点值得注意:

  1. 不能将二进制转成整数后相加,这样会导致越界
  2. 再相加时需要考虑高位溢出的问题

为了更好的处理高位溢出,我们将较大的数作为被加数,较小的作为加数。例如当 a = "1011", b = "111011" 时, a 就是加数,b 是被加数。

大致的步骤如下所示:

  1. 选择较大的数作为被加数
  2. 从右至左遍历被加数(低位到高位),并与加数对应位置上的数相加
  3. 如果有高位溢出,则将结果的前面 加上1
  4. 返回结果即可

举个例子

此处以上面的 a = "1011", b = "111011" 作为例子

  1. b = "111011" 作为加数
  2. 开始遍历并与加数相加,结果为 000110
  3. 有高位溢出,在结果的高位上加上 1
  4. 返回结果 1000110 即可

二、实现

实现代码与思路中保持一致

实现代码

    public String addBinary(String a, String b) {
        char[] source;  // 被加数组
        char[] add; // 加数组
        if (b.length() > a.length()) {
            source = b.toCharArray();
            add = a.toCharArray();
        } else {
            source = a.toCharArray();
            add = b.toCharArray();
        }
        int lenDiff = source.length - add.length;   // 两数组差值
        // 是否需要进位
        int carry = 0;
        // 从低位到高位遍历字符串
        for (int i=source.length-1; i>-1; i--)  {
            int n1 = i-lenDiff > -1  ? add[i-lenDiff] - '0' : 0;
            int n2 = source[i] - '0';
            int ret = n1 + n2 + carry;
            if (ret/2 > 0) {    // 需要进位
                carry = 1;
                source[i] = (char) ('0' + ret%2);
            } else {    // 不需要进位
                carry = 0;
                source[i] = (char) ('0' + ret);
            }
        }
        return carry > 0 ? "1" + String.valueOf(source) : String.valueOf(source);
    }

测试代码

    public static void main(String[] args) {
        String ret = new Number67().addBinary("1011", "111011");
        System.out.println(ret);
    }

结果

image.png

三、总结

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~