LeetCode.67 二进制求和|Java 刷题打卡

161 阅读1分钟

本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接

题目描述:

原题地址

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

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

示例一

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

示例二

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

提示

  • 每个字符串仅由字符 '0' 或 '1' 组成。
  • 1 <= a.length, b.length <= 10410^4
  • 字符串如果不是 "0" ,就都不含前导零

思路分析

这题第一个想到的就是官方题解中的方法一:模拟,就是所谓的竖列式,末尾对齐,逐位相加。在十进制的计算中逢十进一,二进制中我们需要逢二进一。这个就不写具体过程了。

然后看了题解,大多数都是用的位运算,也是第一次接触位运算,自己在小本本上比划了好几遍才算是明白整个流程。

位运算

示例: a = "1010", b = "1011"

  • 步骤一:补全二进制位

    • a = "0000 1010", b = "0000 1011"
  • 步骤二:a ^ b

    ^表示异或操作,对于二进制来说,当两对应的二进位相异时,结果为1。其实就是不带进位的加法。

  • 步骤三:a & b

    &表示与操作,对于二进制来说,如果两个相应位都为1,则该位的结果为1,否则为0。

    此结果左移一位(<<1)得到进位数。

  • 步骤四: 将步骤二算出的a ^ b更新给a,将步骤三算出的进位数更新给b,重复步骤二和步骤三,直到b为0时,说明没有进位了。此时a的值即为答案。

ps:

a = 0000 1010, b = 0000 1011
a ^ b      = 0000 0001         --> 新的a
(a&b) << 1 = 0001 0100         --> 新的b

a ^ b      = 0001 0101         --> 新的a
(a&b) << 1 = 0000 0000         --> 新的b   b已经为0 a即为答案10101

AC代码

class Solution {
    public String addBinary(String a, String b) {
        int x = Integer.parseInt(a,2);
        int y = Integer.parseInt(b,2);
        int ans = 0, carry = 0;
        while(y > 0) {
            ans =  x^y;
            carry = (x&y)<<1;
            x = ans;
            y = carry;
        }
        return  Integer.toBinaryString(x);
    }
}

总结

第一次接触位运算,还需要多刷几题找找感觉。

参考

官方解题

「手画图解」位运算、逐位相加、二者结合

[官方题解方法二]详解 不使用加法 位操作