题目描述:二进制加法
给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "10"
输出: "101"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
提示:
每个字符串仅由字符 '0' 或 '1' 组成。
1 <= a.length, b.length <= 10^4
字符串如果不是 "0" ,就都不含前导零。
分析:
题目中给定如下需求:
- 字符串非空且 只含 1 或 0
- a和b的长度在[1,10000] 也就是说远超一般整数范围内
方向:
- 可以通过调用
java api
直接转化为int,相加后再转化为 二进制返回结果【必须在int范围内】 - 就使用二进制,模拟十进制相加的方式,从后向前挨个遍历,全部相加后返回结果
代码:
第一版:
只能在传入值是在int范围内执行【也可以换成Long,但是作用不大】
描述:简单的写法,所有的过程都是通过调用java
内部的api
class Solution {
public String addBinary(String a, String b) {
//01、将传入的值转化为十进制 valueOf 底层调用parseInt
return Integer.toBinaryString(
Integer.valueOf(a,2)+ Integer.valueOf(b,2)
)
}
}
第二版:
描述:模拟一下十进制加法的过程,实现二进制加法
class Solution {
public String addBinary(String a, String b) {
//01、计算a和b的长度,并求a和b的max_len
//02、carry 为 当前的进位
//03、builder 类似于我们的草稿纸😊,记录当前从后往前算出来的结果
int a_len = a.length();
int b_len = b.length();
int max_len = Math.max(a_len,b_len);
int carry = 0;
StringBuilder builder = new StringBuilder();
//04、从后向前遍历,如果a或者b 中长度不够,按照0来算
for(int i=0;i<max_len;i++){
// tmp值是当前上下位加起来的结果,因为charAt方法后的‘char’类型,不是‘int’类型,所以需要-‘0’取对应的int值
int tmp = (a_len-i-1)>=0?(a.charAt(a_len-i-1)-'0'):0;
tmp += (b_len-i-1)>=0?(b.charAt(b_len-i-1)-'0'):0;
// tmp需要继续加进位值,之后取余的意思是满2进一,不满的话,就把当前结果作为该位的相加值
builder.append((carry+tmp)%2);
// carry需要更新,如果满2了,就重新设置进位,如果不满二那么进制为0
carry = (carry+tmp)/2;
}
//05、遍历结束后,判断carry是否为1,是的话继续还需向左挪动一位设置为1,否则不操作
if(carry==1)builder.append(carry);
//06、因为builder是从低位向高位追加,所以这里反转打印,按照从高位到低位返回
return builder.reverse().toString();
}
public static String first01(String a,String b){
//01、将传入的值转化为十进制 valueOf 底层调用parseInt
return Integer.toBinaryString(
Integer.valueOf(a,2)+ Integer.valueOf(b,2)
);
}
}
总结:
该题解法简单,问题是如何将代码书写的精炼且剪短。刚开始写的代码确实很乱,后来借鉴官方解释,将自己的代码进行精炼,发现确实好多了。
大家好,我是二十一画,感谢您的品读,如有帮助,不胜荣幸~😊