本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接
题目描述:
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例一
输入: a = "11", b = "1"
输出: "100"
示例二
输入: a = "1010", b = "1011"
输出: "10101"
提示
每个字符串仅由字符 '0' 或 '1' 组成。- 1 <= a.length, b.length <=
字符串如果不是 "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);
}
}
总结
第一次接触位运算,还需要多刷几题找找感觉。