原题链接:67. Add Binary
【思路1】
思路1和思路3思路是一样的,也是用0补齐最短字符串左侧,至两字符串等长,如 a = "1111", b = "1",其基本实现就是实现 a = "1111",b = "0001",这样相加,只是代码更简洁:
public String addBinary(String a, String b) {
int maxLen = Math.max(a.length(), b.length());
StringBuilder sb = new StringBuilder();
int carry = 0;
for (int i = 0; i < maxLen; i++) { //从右边开始逐位取出字符串 a、b 的字符值 tempA 和 tempB,如果长度不足,则用0替代
int tempA = a.length() > i ? a.charAt(a.length() - i - 1) - '0' : 0;
int tempB = b.length() > i ? b.charAt(b.length() - i - 1) - '0' : 0;
sb.insert(0, (tempA + tempB + carry) % 2); //在最左侧插入相加结果
carry = tempA + tempB + carry > 1 ? 1 : 0; //得到进位
}
if (carry == 1) sb.insert(0, 1); //如果最高位有进位,则最高位还要加一位 1
return sb.toString();
}
294 / 294 test cases passed. Runtime: 5 ms Your runtime beats 30.64% of javasubmissions.
【思路2】:
先将两个字符串逐位从右到左相加的和与进位相加,放入字符数组中。最后等到短的字符串加完之后,留下较长的为加完毕字符串和进位,用以补充字符数组。当然这种解法比较麻烦:
public class Solution {
public static String addBinary(String a, String b) {
if(a.equals("")) return b;
if(b.equals("")) return a; //如果b为空,则返回a
int al = a.length() - 1; //字符串a的长度减1,刚好指向数组的末尾
int bl = b.length() - 1;
int t = Math.max(al, bl) + 1;
char[] arr = new char[t+1]; //设置要创建char数组的长度
int c = 0;
/*char[] str1 = a.toCharArray();
char[] str2 = b.toCharArray();*/ //注释部分是将字符串放入数组中,这种方法以后再实现,如果读者有兴趣的话,可以自己尝试实现。
for(; al>=0 && bl>=0; al--, bl--, t--) { //这里实现a1与b1的位相加
int s = a.charAt(al) + b.charAt(bl) + c - '0' - '0';
if(s==2) {
c = 1;
s = 0;
} else if(s == 3) {
c = 1;
s = 1;
}
else c = 0;
arr[t] = (char)(s+'0');
}
while (al >= 0) { //若b字符串长度小于a长度,则继续求 a 和进位的和
if(a.charAt(al) - '0' + c > 1) {
arr[t] = 0 + '0';
c = 1;
} else {
arr[t] = (char) (a.charAt(al) + c);
c = 0;
}
t--;
al--;
}
while (bl >= 0) {
if(b.charAt(bl) - '0' + c > 1) {
arr[t] = 0 + '0';
c = 1;
} else {
arr[t] = (char) (b.charAt(bl) + c);
c = 0;
}
t--;
bl--;
}
if(c == 1) arr[0] = 1+'0';
//将数组转化为字符串输出
return new String(arr).trim();
}
}
294 / 294 test cases passed. Runtime: 3 ms Your runtime beats 91.41% of javasubmissions.
【思路3】:
麻烦之处在于字符串有长短之分,如果不控制好,可能会造成空指针异常。那么我们可以将最短的字符串右端用0补齐,这时两个字符串就等长了,这样就可以逐位相加,最后还有判断是否有进位,如果有进位还得在最左端补上一位1:
public class Solution {
public String addBinary(String a, String b) {
int aLen = a.length();
int bLen = b.length();
if(aLen > bLen) { //字符串 b 的长度较长
int gap = aLen - bLen;
while(gap-- > 0) b = 0 + b; //用0补齐字符串 b 至字符串 a、b 等长
}
if(bLen > aLen) {
int gap = bLen - aLen;
while(gap-- > 0) a = 0 + a;
}
int maxLen = aLen > bLen ? aLen : bLen;
int c = 0, sum = 0;
String result = "";
for(int i = --maxLen; i >= 0; i--) {
sum = a.charAt(i) + b.charAt(i) + c - '0' * 2;
if(sum > 1) {
c = 1;
sum -= 2;
} else {
c = 0;
}
result = sum + result;
}
if(c == 1) result = 1 + result;
return result;
}
}
294 / 294 test cases passed. Runtime: 5 ms