Leetcode 67:Add Binary

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代码如下:

a
10101
    0            1              2          3        4                                        i
b
 111
                  0             1            2


result
      

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的比较和差别。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值