一开始我是有两个思路的,第一个是直接在字符位来计算,第二个是先转化为int整型,然后计算,再转换为String,这个想法 明显忽略掉 超过32的大数的可能。设计算法要考虑可能的范围
我的算法 : 耗时 6ms
public class Solution {
public String addBinary(String a, String b) {
// 先求出两个字符串哪个的位数比较长
int length_a = a.length();
int length_b = b.length();
String newNum = "";
// 给短的字符串补零
if(length_a > length_b){
char[] s_0 = new char[length_a - length_b];
Arrays.fill(s_0,'0');
String s = new String(s_0);
b = s + b;
length_b = b.length();
} else {
char[] s_0 = new char[length_b - length_a];
Arrays.fill(s_0,'0');
String s = new String(s_0);
a = s + a;
length_a = a.length();
}
// 计算
int carry = 0;
int a_int=0,b_int=0;
for(int i = length_a-1;i>=0;i--){
a_int = a.charAt(i)-'0';
b_int = b.charAt(i)-'0';
int sum = a_int+b_int+carry;
int k = 0;
switch(sum){
case 0:
k = 0;
carry = 0;
break;
case 1:
k = 1;
carry = 0;
break;
case 2:
k = 0;
carry = 1;
break;
case 3:
k = 1;
carry = 1;
break;
}
// add k to string
newNum = String.valueOf(k)+newNum;
}
if(carry == 1){
newNum = String.valueOf(1)+newNum;
}
return newNum;
}
}
在如何补零那里研究了一会,可以通过charset来初始化一个stirng,而一个charset可以用 Arrays.fill(charset,'x')
来填满
大神的代码,简洁干净,只要2ms
public class Solution {
public String addBinary(String a, String b) {
// 交换,使得a为长的,b为短的
// 这是一个很好的策略,在不知道那个是长的,哪个是短的情况下,不如先交换确定
String temp="";
if(a.length()<b.length()){
temp=a;
a=b;
b=temp;
}
// 我上面的方法是不断的使用charAt来获取字符串中的某一个字符,但是明显是先 转化为 字符数组 更加的高效
char[] arA=a.toCharArray();
char[] arB=b.toCharArray();
char[] arC=new char[a.length()+1];
int i=a.length()-1;
int j=b.length()-1;
int carry=0;
int tempSum=0;
while(i>=0){
if(j>=0){
tempSum=arA[i]-'0'+arB[j]-'0'+carry;
--j;
}
else{
tempSum=arA[i]-'0'+carry;
}
carry=tempSum/2;
arC[i+1]=(char)(tempSum%2+'0');
--i;
}
// 如果有进位,则返回全部,如果没有进位,则返回部分
arC[i+1]='1';
if(carry>0){
return String.valueOf(arC);
}
else{
return String.valueOf(arC).substring(1,a.length()+1);
}
}
}