这题花了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 }