002 Leecode 67 二进制加法
给定两个 01 字符串 a
和 b
,请计算它们的和,并以二进制字符串的形式输出。输入为 非空 字符串且只包含数字 1
和 0
。
提示:
每个字符串仅由字符 '0' 或 '1' 组成。 1 <= a.length, b.length <= 10^4 字符串如果不是 "0" ,就都不含前导零。
来源:力扣(LeetCode) 链接:力扣
题解
方法一:年轻人不讲码德
import java.math.BigInteger; class Solution { public String addBinary(String a, String b) { return new BigInteger(a,2).add(new BigInteger(b,2)).toString(2); } }
方法二:二进制加法模拟
1.用carry作进位符,逢二进一
2.将两个字符串都翻转,最后再翻转回来
3.判断字符串长度,如果有一个提前结束,则该位为0
class Solution { public String addBinary(String a, String b) { StringBuffer ans = new StringBuffer(); int n = Math.max(a.length(),b.length()),carry = 0; for(int i=0; i<n; ++i){ 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.append((char)(carry % 2 + '0')); carry /=2; } if(carry > 0){ ans.append('1'); } ans.reverse(); return ans.toString(); } }
方法三:位运算
把 a 和 b 转换成整型数字 x 和 y,在接下来的过程中,x保存结果,y保存进位。 当进位不为 0 时 计算当前 x 和 y 的无进位相加结果:answer = x ^ y 计算当前 x 和 y 的进位:carry = (x & y) << 1 完成本次循环,更新 x = answer,y = carry