原题
给你两个二进制字符串,返回它们的和(用二进制表示)
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = “11”, b = “1”
输出: “100”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
一、思路
位数相加,如果位数相加结果等于2,位数变0,进1位,小于1位数正常相加
在前一位相加仍等于2,位数变0,向前递增1
二、解题
1.思路1
代码如下(示例):
public String addBinary(String a, String b) {
// 进位
int num=0;
char[] achars = a.toCharArray();
char[] bchars = b.toCharArray();
int lengths= a.length()>b.length()?a.length():b.length();
StringBuffer result=new StringBuffer();
// for (int i =lengths-1; i >=0 ; i--) {
for (int i =0; i <lengths ; i++) {
int i1 = 0;
if(i<a.length()){
i1 = achars[a.length()-1-i] - '0';
}
int i2 = 0;
if(i<b.length()){
i2 = bchars[b.length()-1-i] - '0';
}
// 位数相加
int i3 = i1 + i2;
if( i3==0){
if(num!=0){
result.append("1");
num--;
}else{
result.append("0");
}
}
if( i3==1){
if(num!=0){
result.append("0");
}else{
result.append("1");
}
}
if( i3==2){
if(num!=0){
result.append("1");
}else{
result.append("0");
num=1;
}
}
}
// 如果num仍然为1 需拼接到前一位
if (num==1) {
result.append(num);
}
// 翻转字符
return result.reverse().toString();
}
2.思路2
朋友更优化思路,在做算法使用算法逻辑更加使用简洁
public String addBinary(String a, String b) {
StringBuffer ans = new StringBuffer();
// 对比两个长队最大
int n = Math.max(a.length(), b.length()),
carry = 0;//carry表示上一位置的进位,初始为0
//从低位开始遍历相加,a、b中短的位置补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();
}