[LeetCode] #67 二进制求和
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1
和 0
。
输入: a = "11", b = "1"
输出: "100"
首先,循环相加两个字符串相同长度的低位数部分;
如果 a 还没遍历完成(a串比b串长),则继续遍历添加 a 的剩余部分;
如果 b 还没遍历完成(b串比a串长),则继续遍历添加 b 的剩余部分;
如果 carry 等于1,表示还有一次进位;
最后,反转字符串获得正常结果。
class Solution { public String addBinary(String a, String b) { int i = a.length() - 1; int j = b.length() - 1; int carry = 0; StringBuilder builder = new StringBuilder(); while (i >= 0 && j >= 0) { int sum = carry; sum += a.charAt(i--) - '0'; sum += b.charAt(j--) - '0'; carry = sum / 2; builder.append(sum % 2); } while (i >= 0) { int sum = carry + a.charAt(i--) - '0'; carry = sum / 2; builder.append(sum % 2); } while (j >= 0) { int sum = carry + b.charAt(j--) - '0'; carry = sum / 2; builder.append(sum % 2); } if (carry == 1) { builder.append(carry); } return builder.reverse().toString(); } }
化简
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(carry%2); carry /= 2; } if (carry == 1) { ans.append(carry); } return ans.reverse().toString(); } }
另一种思路,先将a和b转化成十进制数,求和后再转化为二进制数。
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); } }
知识点:
java中char转int
char c = '1'; int i = c - '0';
StringBuilder的append方法
BigInteger构造函数
1、BigInteger(byte[] val)
这个构造函数用于转换一个字节数组包含BigInteger的二进制补码,以二进制表示成一个BigInteger。
(用字节数组中值的ASCII码构造BigInteger)
2、BigInteger(int signum, byte[] magnitude)
此构造函数用于将BigInteger的符号大小表示法转换成一个BigInteger值。
(和第一种一样,增加了符号:1,0,-1)
3、BigInteger(int bitLength, int certainty, Random rnd)
此构造函数用于构造一个随机生成正BigInteger的可能是以指定的bitLength的素数。
(bitLength:返回的 BigInteger 的 bitLength;
certainty:调用方允许的不确定性的度量。新的 BigInteger 表示素数的概率超出 (1 - 1/2certainty)。此构造方法的执行时间与此参数的值是成比例的;
rnd:随机比特源,用这些随机比特选择用来进行质数测试的候选数。)
4、BigInteger(int numBits, Random rnd)
此构造函数用于构造一个随机生成的BigInteger,范围在0到 (2numBits - 1), 包括边界值。
5、BigInteger(String val)
此构造函数用于将十进制的字符串转换成一个BigInteger值表示形式。
6、BigInteger(String val, int radix)
这个构造函数用于将指定基数的数值字符串转换为BigInteger表示形式。
总结:
遍历长短不一的序列时,可以先遍历相同部分,再遍历剩余部分;
若同时遍历,需要判断短序列是否结束,结束则使其执行无效操作。