给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = “11”, b = “1”
输出: “100”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
提示:
每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。
1 <= a.length, b.length <= 104
字符串如果不是 “0” ,就都不含前导零。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/add-binary
(1)将字符串 a 和 b 转化成十进制数并求和,然后再转化为二进制数即可。不过当题目中字符串的长度非常大时,就有可能超过Java所能表示的范围,所以该思路具有一定的局限性。
(2)采用整数加法中列竖式的方法来求解本题,即将这两个二进制字符串从低位到高位逐位相加,并且记录相加过程中产生的进位,将其考虑到下一轮运算中即可。
//(1)思路1 public String addBinary(String a, String b) { /* toBinaryString(int i):返回int变量的二进制表示的字符串 Integer.parseInt(s,2):将字符串s转换为二进制的整数 */ return Integer.toBinaryString(Integer.parseInt(a,2)+Integer.parseInt(b,2)); }
//(2)思路2 public String addBinary(String a, String b) { //代码来自本题官方题解 /* 在使用 StringBuffer类时,每次都会对 StringBuffer对象本身进行操作,而不是生成新的对象, 所以如果需要对字符串进行修改推荐使用StringBuffer,而此题可好需要需要对字符串进行修改。 */ StringBuffer ans = new StringBuffer(); //carry表示进位 int n = Math.max(a.length(), b.length()), carry = 0; for (int i = 0; i < n; ++i) { //将a和b的最低位依次进行相加 carry += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0; carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0; //将中间结果追加到ans之后 ans.append((char) (carry % 2 + '0')); /* 进行上述的一次计算后,carry的可能取值为0、1或2 1.carry=0,说明a、b当前位上的值均为'0',没有进位 2.carry=1,说明a、b当前位上的值有一个位'0',有一个为'1',没有进位 3.carry=2,说明a、b当前位上的值均为'1',产生进位 当进行下一轮计算时,只有当carry=2时才产生了进位,此时需要使carry变成1, 而其它情况下没有产生进位,则使carry变成0即可,而carry/=2正好满足要求 */ carry/=2; } //如果进位大于0,则需要向高位添加一个"1" if (carry > 0) { ans.append('1'); } /* reverse():将字符序列进行反转 例如s="123",那么s.reverse()之后,s="321" */ ans.reverse(); //以字符串的形式进行返回 return ans.toString(); }