将两个以String表示的二进制数从低位逐个相加,使用一个carry变量循环记录每一位相加的进位,并且在循环相加下一位的时候把carry也加进来。把String中的char变成数字的方式非常巧妙,使用ASCII编码的特性,用每一位的char减去'0',得到的就是这个char所对应的数字。这道题目体现了很好的循环相加的思想,需要记一下。时间复杂度为O(max(m, n)),代码如下:
public class Solution {
public String addBinary(String a, String b) {
StringBuilder sb = new StringBuilder();
int i = a.length() - 1;
int j = b.length() - 1;
int carry = 0;
int sum = 0;
while(i >= 0 || j >= 0){
sum = carry;
if(i >= 0) sum += a.charAt(i--) - '0';
if(j >= 0) sum += b.charAt(j--) - '0';
sb.append(sum % 2);
carry = sum / 2;
}
if(carry != 0) sb.append(carry);
return sb.reverse().toString();
}
}
知识点:
1. Java中char变成数字的方法,利用ASCII编码的特性,把这个char减去'0'即可
2. Java中StringBuilder的用法,记住它的几个常用的method:append, reverse, toString
3. 这道题目使用String表示的二进制,但是实际上这道题目可以进一步进行扩展,相加使用String表示的任何进制的数字,总体思想都是一样的,使用carry循环从低到高相加对应的每一位,最后使用StringBuilder返回
4. 注意最后要把sb给reverse一下才能得到正确的二进制表示
5. 题目中循环的使用也很巧妙,一开始想的是while( && ),但是这样最后由于不确定是哪个先结束,还要再次检查一下,这里直接使用while( || ),在循环体重检查,省去了额外检查的麻烦,而且程序看起来很优雅