题目要求:
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1
和 0
。
示例 1:
输入: a = "11", b = "1"
输出: "100"
示例 2:
输入: a = "1010", b = "1011"
输出: "10101"
(1)使用jdk进制转化
1,第一时间想到使用jdk自带方法,将给定的二进制数转化为十进制;
2,然后相加,然后将和重新转化为二进制即可;
3,想的很简单,实现也简单,但是不管是有Integer或者Long都是有范围的,超出的话肯定会报错,果然抛异常numberformatexception;
private String add1(String a, String b){
int i = Integer.parseInt(a, 2);
int j = Integer.parseInt(b,2);
System.out.println("i:" + i + ",j:" + j);
return Integer.toBinaryString(i + j);
}
(2)逐位相加
进位:1+1=2进位,1+1+1=3进位(当高位为1+1,低位又进一个位)。无需进位的情况:0+0=0,0+1=1.接下来继续想,当每个位上求和结果为2时,需要进位,此位变为0,向高位进1;当求和结果为0或者1时,无需进位;当求和结果为3时 ,此位变为1,向高位进1.最后一个问题,就是怎么把字符串每个对应位置上的数一 一相加,可以用String方法里的substring()方法。
public String addBinary1(String a, String b) {
String result = "";
int aLen = a.length() - 1;
int bLen = b.length() - 1;
int sum = 0;
while(aLen>=0 || bLen>=0){
if(aLen>=0){
sum +=Integer.parseInt(a.substring(aLen,aLen+1));
aLen--;
}
if(bLen>=0){
sum +=Integer.parseInt(b.substring(bLen,bLen+1));
bLen--;
}
if(sum==2){
result = "0" + result;
sum=1;
}else if(sum==0 || sum==1) {
result = sum +"" + result;
sum = 0;
}else if(sum==3){
result = "1" + result;
sum = 1;
}
}
if(sum==1)
result = "1" + result;
return result;
}