Add Binary
Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100"
.
1.【算法思路】先把二进制字符串转化为二进制相加后,得到十进制整形,后转化为二进制。
public class Solution {
public String addBinary(String a, String b) {
long _a = Integer.parseInt(a,2);
long _b = Integer.parseInt(b,2);
long _c = _a + _b;
//long _c = Integer.parseInt(a,2)+Integer.parseInt(b,2);//二进制字符串类型转化为十进制整形;
// String c = Integer.toBinaryString(_c) ;//十进制整形转化为二进制字符型,一种方法;
//十进制整形转化为二进制字符型,但是逆序的,需要reverse()转换,另一种方法;
String c = "";
while(_c != 0){
c = c + _c%2;
_c=_c/2;
}
return reverse(c);
}
//需要reverse()转换
public static String reverse(String s){
char[] chars=s.toCharArray();
int i;
s="";
for(i=chars.length-1;i>=0;i--)
s+=chars[i];
return s;
}
/* public int parseInt(String s,
int radix) throws NumberFormatException{
}*/
}
Testcase:
注意点:
1) 对小数据,此方法可行(Judge Small is ok); 但对大数据,此方法溢出(Judge Large is wrong)
2)此算法,问题可以引申异常计算问题(大整数加、减、乘、除)
2.大数据时,算法的优化:
优化后的算法为:
【算法思路】:想从字符串的最高位(二进制的最低位)相加,也就是二进制的最低位相加,逐步进位相加,当位数少的二进制高位添0,和十进制加法类似,再与位数多的相加,直到都最高位后,再判断carry进位,决定二进制最高位是否置1……
public class Solution {
public String addBinary(String a, String b) {
StringBuffer result = new StringBuffer("");
int i = a.length() - 1;
int j = b.length() - 1;
int carry = 0;
int acurrent = 0;
int bcurrent = 0;
//从二进制的最低位相加,逐步进位相加,当位数少的二进制高位添0,和十进制加法类似
for(;i>=0||j>=0;i--,j--) {
acurrent = (i>=0? a.charAt(i) - '0' : 0);
bcurrent = (j>=0? b.charAt(j) - '0' : 0);
int current = (acurrent + bcurrent + carry)%2;
carry = (acurrent + bcurrent + carry)/2;
result = result.insert(0, current);
}
if(carry ==1) {
result.insert(0, '1');
}
return result.toString();
}
}
Testcase:
再大的数也可以计算出来,是比较优代码量最小的算法了
假设:
a= "10101",b ="111"
AC代码如下:
1 | 0 | 1 | 0 | 1 |
1 | 1 | 1 |
0 1 2 3 4 5
开始i=4,j= 2开始循环:
carry= 0,(1+1+0)%2=0,(1+1+0)/2=1;result="0",carry = 1;
i=3,j=1,继续
carry = 1,(0+1+1)%2=0,(0+1+1)/2=1,result="00",carry = 1;
i=2,j=0;继续
carry = 1,(1+1+1)%2=1,(1+1+1)/2=1,result="100",carry = 1;
i=1,j=-1;继续
carry = 1,(0+o+1)%2=1,(0+0+1)/2=0,result="1100",carry = 0;
i=0,j=-2;继续
carry = 0,(1+0+0)%2=1,(1+0+0))/2=0,result="11100",carry = 0;
直到i=-1<0,j=-3<0;循环结束。
注意StringBuffer和String的比较和差别。