LeetCode#67--Add Binary(用Java实现二进制相加)

这题花了3小时……116行代码,已经突破我目前的编码纪录

题目:

Given two binary strings, return their sum (also a binary string).

For example,
a = "11"
b = "1"
Return "100". 

分析:

1.第一反应是采用二进制转十进制,相加,十进制再转回二进制

在Eclipse中正确无误,到了LeetCode中,呵呵呵呵呵呵,测试案例是超长的二进制数,转化成十进制数越界!

不过这种封装好的API的确很好用!源码如下:

 1         //真尼玛醉了,转化成int会越界啊!还是老实的用数组吧
 2         /**String s=a;
 3         int m=0;
 4         int n=0;    
 5         m=Integer.valueOf(a, 2);
 6         n=Integer.valueOf(b, 2);        
 7         int sum=m+n;
 8         s=Integer.toBinaryString(sum);
 9         System.out.print(s);
10         return s;*/

2.于是开始考虑字符串拆分:

给两个字符串,两个字符串要转化成数组,才能对对应的位相加,设置进位位来记录,短的那个要左端补齐,在字符串补齐比数组补齐更方便。

学到的知识点:

1.字符串s.length()表示该字符串的长度

2.字符串之间可以用+表示连接,如左侧补零操作:s='0'+s

3.将一个字符串转化为一个字符数组:

1 char []a=new char[100]
2 a=s.toCharArray();

4.注意转化完之后,数组类型是char,而不是int,不能进行大小比较,以下减去‘0’,则得到二者之间的距离,就是对应的整数

1 b[i]=a[i]-'0'

 

最终Accepted代码如下:

  1 public class Solution {
  2     public String addBinary(String a, String b) {
  3      String res="";
  4         int max=0;
  5         int c=0;
  6         int d=0;//两个数组的长度差距
  7         //补齐短的那个字符串,比之前补齐数组更为简单易懂
  8         if(a.length()>b.length()){
  9             max=a.length();
 10             d=max-b.length();
 11             for (int i = 0; i <d; i++) {
 12                  b="0"+b;
 13                 }    
 14         }
 15             else {
 16                 max=b.length();
 17                 d=max-a.length();
 18                 for (int i = 0; i <d; i++) {
 19                      a="0"+a;
 20                     }
 21         }
 22         int []m=new int[max];
 23         int []n=new int[max];
 24         char []p=new char[max];
 25         char []q=new char[max];
 26         int []r=new int[max+1];//问题出在这!!!定义的是char数组,怎么能相比较?!!!
 27         p=a.toCharArray();
 28         q=b.toCharArray();
 29         //一下检查输出是否正确的补零到左边并成功建立两个数组
 30         for (int i = 0; i < p.length; i++) {
 31             m[i]=p[i]-'0';
 32             System.out.println(m[i]);
 33         }
 34         //System.out.println("hello");//将两个隔开验证的
 35         for (int i = 0; i < q.length; i++) {
 36             n[i]=q[i]-'0';
 37             System.out.println(n[i]);
 38         }
 39         /**
 40         //此处对那个段数组进行处理,前面短的部分要补充零
 41         if (a.length()>b.length()) {
 42             //补b前面
 43             for(int i=b.length()-1,j=max-1;i>0;i--,j--){
 44                 n[j]=n[i];
 45             }
 46             for (int i = 0; i <d-1; i++) {
 47                 n[i]=0;
 48             }
 49         }
 50         else {
 51             //补a前面
 52             for(int i=a.length()-1,j=max-1;i>0;i--,j--){
 53                 m[j]=m[i];
 54             }
 55             for (int i = 0; i <d-1; i++) {
 56                 m[i]=0;
 57             }
 58         }
 59         */
 60         
 61         for (int i = max-1; i >=0; i--) {
 62             if ((m[i]==0)&&(n[i]==0)&&(c==0)) {
 63                 r[i+1]=0;
 64                 c=0;
 65             }
 66             else if (m[i]==1&&n[i]==0&&c==0) {
 67                 r[i+1]=1;
 68                 c=0;
 69             }
 70             else if (m[i]==0&&n[i]==1&&c==0) {
 71                 r[i+1]=1;
 72                 c=0;
 73             }
 74             else if (m[i]==0&&n[i]==0&&c==1) {
 75                 r[i+1]=1;
 76                 c=0;
 77             }
 78             else if (m[i]==1&&n[i]==1&&c==0) {
 79                 r[i+1]=0;
 80                 c=1;
 81             }
 82             else if (m[i]==1&&n[i]==0&&c==1) {
 83                 r[i+1]=0;
 84                 c=1;
 85             }
 86             else if (m[i]==0&&n[i]==1&&c==1) {
 87                 r[i+1]=0;
 88                 c=1;
 89             }
 90             else {
 91                 r[i+1]=1;
 92                 c=1;
 93             }
 94         }
 95         //此处检查进位c是否正确输出
 96         //System.out.println(c);
 97 
 98         if (c==1) {
 99             r[0]=1;
100             for (int i = 0; i < r.length; i++) {
101                 res=res+(r[i]);
102                 //System.out.print(r[i]);
103             }
104         }else {
105             r[0]=0;
106             for (int i = 1; i < r.length; i++) {
107                 res=res+(r[i]);
108                 //System.out.print(r[i]);
109             }
110         }
111         
112     
113         
114         return res;
115 }
116 }

 

转载于:https://www.cnblogs.com/jennifer8385/p/4859308.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值