二进制的加法
经过测试之后,发现没有考虑整型数据溢出。
leetcode经常会有一些意想不到的例外。我以为是一道解法很丰富的题,选择了:把string转为int,用int的加法,再转为string返回。因为我讨厌用字符串来进位。但是溢出了。可以改进一下,用BigInteger这个类。
先贴上我的错误代码。
import java.io.*; import java.util.*; import java.lang.*; public class Solution { public static int toInt(String s) { int len=s.length(); int i=0,r=0; char[] c=s.toCharArray(); for(i=0;i<len;i++) { r=r*2+c[i]-'0'; } return r; } public static String toStr(int n) { String s=new String(); int x=n; while(x!=0) { if(x%2==0) s=s+"0"; else s=s+"1"; x=x/2; } int len=s.length(); char[] c=s.toCharArray(); char[] b=new char[len]; int i=0; for(i=0;i<len;i++) { b[i]=c[len-1-i]; } String r=String.valueOf(b); return r; } public static String addBinary(String a, String b) { if(a==null) return b; if(b==null) return a; return toStr(toInt(a)+toInt(b)); } public static void main(String[] args) { //System.out.println(addBinary("11","1")); System.out.println(addBinary("1010","1011")); } }
改为BigInteger版本后,错误是
一口老血。
虽然很气可是也仍然要微笑呀:)
测试:
然后我发现一件神奇的事情
如图所示,我输入的数字是以1结尾的二进制数据,然而这个网站竟然给我一个偶数。我首先怀疑的是我自己。难道是我自己出错了吗?
把问题反馈给开源中国。事实上,我测试了好几个数值大的数据,给出的结果都不对。
于是,我开始用二进制手动进位。
(很难受)
import java.io.*; import java.util.*; import java.lang.*; public class Solution { public static String reverse(String s) { int len=s.length(); char[] c=s.toCharArray(); char[] b=new char[len]; int i=0; for(i=0;i<len;i++) { b[i]=c[len-1-i]; } String r=String.valueOf(b); return r; } public static String addBinary(String a, String b) { if(a==null||a.equals("0")) return b; if(b==null||b.equals("0")) return a; int len1=a.length(); int len2=b.length(); int len; if(len1<len2) len=len1; else len=len2; int i; char[] ca=a.toCharArray(); char[] cb=b.toCharArray(); String r=new String(); Boolean flag=false; for(i=len-1;i>=0;i--) { if(ca[i]=='1'&&cb[i]=='1') { if(flag==true) r=r+"1"; else r=r+"0"; flag=true; } if(ca[i]=='1'&&cb[i]=='0') { if(flag==true) { r=r+"0"; flag=true; } else { r=r+"1"; flag=false; } } if(ca[i]=='0'&&cb[i]=='1') { if(flag==true) { r=r+"0"; flag=true; } else { r=r+"1"; flag=false; } } if(ca[i]=='0'&&cb[i]=='0') { if(flag==true) { r=r+"1"; } else { r=r+"0"; } flag=false; } } if(len1>len2) { for(i=len1-len-1;i>=0;i--) { if(ca[i]=='0'&&flag==true) { r=r+"1"; flag=false; } if(ca[i]=='0'&&flag==false) { r=r+"0"; flag=false; } if(ca[i]=='1'&&flag==true) { r=r+"0"; flag=true; } if(ca[i]=='1'&&flag==false) { r=r+"1"; flag=false; } } } else { for(i=len2-len-1;i>=0;i--) { if(cb[i]=='0'&&flag==true) { r=r+"1"; flag=false; } if(cb[i]=='0'&&flag==false) { r=r+"0"; flag=false; } if(cb[i]=='1'&&flag==true) { r=r+"0"; flag=true; } if(cb[i]=='1'&&flag==false) { r=r+"1"; flag=false; } } } if(flag==true) r=r+"1"; String s=reverse(r); return s; } public static void main(String[] args) { //System.out.println(addBinary("11","1")); System.out.println(addBinary("1111","1000")); } }
leetcode总能在我不经意的时候给我使绊子。