public class Solution {
public String addBinary(String a, String b) {
int lenA=a.length();
int lenB=b.length();
if(lenA==0) return b;
if(lenB==0) return a;
// char[] A=a.reverse().toCharArray();
// char[] B=b.reverse().toCharArray();
StringBuilder sb = new StringBuilder(); // this is much better that create an array !!! 熟知ds的特点,并灵活运用多重要!!
int i=lenA-1;
int j=lenB-1;
int advance =0;
while(i>=0 && j>=0){
int sum = (int)(a.charAt(i)-'0')+(int)(b.charAt(j)-'0')+advance;
sb.append(sum%2);
advance=sum/2;
i--;
j--;
}
if(i==-1 && j==-1){
if(advance==1) sb.append(1);
return sb.reverse().toString();
}
else if(i==-1){
for(int k=j; k>=0; k--){
int sum=(int)(b.charAt(k)-'0') + advance; // advance接着沿用,是global变量。。。
sb.append(sum%2);
advance=sum/2;
}
if(advance==1) sb.append(1);
return sb.reverse().toString();
}
else if(j==-1){
for(int k=i; k>=0; k--){
int sum=(int)(a.charAt(k)-'0') + advance; // advance接着沿用,是global变量。。。
sb.append(sum%2);
advance=sum/2;
}
if(advance==1) sb.append(1);
return sb.reverse().toString(); //!!! only StringBuilder has reverse(), String does NOT!!! So use StringBuilder!!!
}
return "";
}
}
刚刚写了第二遍的,明显比这个思路更直接,也更灵活,代码也是更简洁
思路:直接从后面开始加,知道较小程度。多余的部分即不等长部分,判断完carry后,再进行递归调用,这个递归调用并不是我一开始就想到的,写到后面的时候觉得不错,就用了。。nice
public class Solution {
public String addBinary(String a, String b) {
int len1=a.length();
int len2=b.length();
//if(len1==0) return b; // it is okay to have these two, but not neccessary;
//if(len2==0) return a;
int len=Math.min(len1, len2);
StringBuilder result = new StringBuilder();
int carry=0;
for(int i=1; i<=len; i++){
int sum= (a.charAt(len1-i)-'0') + (b.charAt(len2-i)-'0') + carry;
int digit=sum%2;
// a big bug: originally, I did not use sum, but directly use digit=...; then digit=digit%2; carry=digit/2; 顺序反了!!
carry=sum/2;
result.insert(0, digit);
}
if(len1>len2){
if(carry==1){
String prefix= addBinary(a.substring(0, len1-len2), "1");
result.insert(0, prefix);
return result.toString();
}
else{
result.insert(0, a.substring(0, len1-len2));
return result.toString();
}
}
else{
if(carry==1){
String prefix= addBinary(b.substring(0, len2-len1), "1");
result.insert(0, prefix);
return result.toString();
}
else{
result.insert(0, b.substring(0, len2-len1));
return result.toString();
}
}
}
}