题目:
输入两个表示二进制的字符串,计算它们的和,并以二进制字符串的形式输出。例如,输入的二进制字符串分别是“11”和“10”,则输出“101”
leetcode题目连接:https://leetcode.cn/problems/JFETK5/
分析:
二进制加法可以参照十进制加法的竖式,右端对齐,满2进1
Java代码实现:
class Solution {
public String addBinary(String a, String b) {
StringBuilder result = new StringBuilder();
int i = a.length()-1;
int j = b.length()-1;
int carry = 0; //定义进位值
while(i >= 0 || j >= 0){ //保证两个数都遍历到
int digitA = i >= 0 ? a.charAt(i--) - '0':0; //当位数较短的那个数遍历完,i会变成-1,此时把-1位置的值当0处理
int digitB = j >= 0 ? b.charAt(j--) - '0':0;//同上
int sum = digitA + digitB + carry;
carry = sum >= 2 ? 1 : 0; //若sum满2则进1,carry即为1,否则不进为0
sum = sum >= 2 ? sum - 2 : sum; //sum满进2进1,即该位置sum-2
result.append(sum);
}
if(carry == 1){
result.append(1);
}
return result.reverse().toString(); //倒叙排列
}
}
注意:
1、a.charAt(i--) - '0'作用是把字符型转化为int型
2、append()方法
StringBuffer类包含append()方法,append()方法相当于“+”,将指定的字符串追加到此字符序列;StringBuffer.append()追加的字符串在同一个内存地址
reverse()方法用于反转StringBuilder中的字符
复杂度分析:
时间复杂度:O(n)
空间复杂度:O(1)
结果:
以上为个人做题笔记,很多是自己的理解,若有错误还请各位大佬指出~