需求:
给定两个二进制字符串,返回他们的和(用二进制表示)。比如 a = 11,
b = 1,
返回 100
分析:
类似于链表求和,链表求和中,从左向右遍历链表,当两个链表至少有一个不是空的或者进位不为0的时候,需要进行加和运算,对于字符串,可以从后向前遍历,当两字符串至少有一个有值或者进位不为0的时候,需要进行加和运算。
1、当字符串a或b有一个是null或者长度是0,那么直接返回另一个字符串
2、创建字符缓冲区存储结果,初始化字符串a角标i=a.length()-1,字符串b角标j=b.length()-1,进位carry=0,当i和j至少有一个大于等于0或者carry不为0,需要加和运算(注意将字符转成整型数),求出当前位的值存到缓冲区中,更新i、j和carry,直到字符串均遍历完且进位为0,跳出循环
3、返回缓冲区的反向值,因为缓冲区存储的是和的倒序
代码:
public class Solution {
/*
* @param a: a number
* @param b: a number
* @return: the result
*/
public String addBinary(String a, String b) {
// write your code here
//a或b是null或者长度是0,直接返回另一个字符串
if(a == null || a.length() == 0) {
return b;
}
if(b == null || b.length() == 0) {
return a;
}
//从后向前遍历a和b字符串,当a或b不是空的或者进位不是0的时候,需要加和计算
int i = a.length()-1, j = b.length()-1;
int carry = 0;//进位值初始化为0
StringBuilder sb = new StringBuilder();//创建字符缓冲区存储结果
//当字符串a或b有值或者carrry不为0
while(i >= 0 || j >= 0 || carry != 0) {
if(i >= 0) {
carry += a.charAt(i)-'0';//a.charAt(i)是字符,需要转成整型数
i--;
}
if(j >= 0) {
carry += b.charAt(j)-'0';
j--;
}
//将当前位存到缓冲区中
sb.append(carry % 2);
carry /= 2;
}
//缓冲区中的值是反向的和,所以需要反向返回
return sb.reverse().toString();
}
}