「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」
前言
力扣第六十七题 二进制求和 如下所示:
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
一、思路
这一题中有两个点值得注意:
- 不能将二进制转成整数后相加,这样会导致越界
- 再相加时需要考虑高位溢出的问题
为了更好的处理高位溢出,我们将较大的数作为被加数,较小的作为加数。例如当 a = "1011", b = "111011" 时, a 就是加数,b 是被加数。
大致的步骤如下所示:
- 选择较大的数作为被加数
- 从右至左遍历被加数(低位到高位),并与加数对应位置上的数相加
- 如果有高位溢出,则将结果的前面
加上1 - 返回结果即可
举个例子
此处以上面的 a = "1011", b = "111011" 作为例子
- 将
b = "111011"作为加数 - 开始遍历并与加数相加,结果为
000110 - 有高位溢出,在结果的高位上加上
1 - 返回结果
1000110即可
二、实现
实现代码与思路中保持一致
实现代码
public String addBinary(String a, String b) {
char[] source; // 被加数组
char[] add; // 加数组
if (b.length() > a.length()) {
source = b.toCharArray();
add = a.toCharArray();
} else {
source = a.toCharArray();
add = b.toCharArray();
}
int lenDiff = source.length - add.length; // 两数组差值
// 是否需要进位
int carry = 0;
// 从低位到高位遍历字符串
for (int i=source.length-1; i>-1; i--) {
int n1 = i-lenDiff > -1 ? add[i-lenDiff] - '0' : 0;
int n2 = source[i] - '0';
int ret = n1 + n2 + carry;
if (ret/2 > 0) { // 需要进位
carry = 1;
source[i] = (char) ('0' + ret%2);
} else { // 不需要进位
carry = 0;
source[i] = (char) ('0' + ret);
}
}
return carry > 0 ? "1" + String.valueOf(source) : String.valueOf(source);
}
测试代码
public static void main(String[] args) {
String ret = new Number67().addBinary("1011", "111011");
System.out.println(ret);
}
结果
三、总结
感谢看到最后,非常荣幸能够帮助到你~♥
如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~