Given two binary strings, return their sum (also a binary string).
For example,
a = "11"
b = "1"
Return "100"
.
实现二进制数相加,算法很简单就是两个String每位去相加,然后判断是否要进位。
一开始想到了一个不同的算法,即将两个String转为int型然后相加,然后判断每一位给出一个新的字符串。
可是,越写越多,遇到各种不同的问题,比如输入的二进制过长,于是改用大数。改了很渣的代码出来。
结果还是有一些条件没考虑到而WA,也罢懒得再想回归最初的简单思想。
WA代码:
public class solution { public static String addBinary(String a, String b) { String c=""; boolean flag = false; BigInteger l1 = new BigInteger(a); BigInteger l2 = new BigInteger(b); l1=l1.add(l2); if(l1.equals(BigInteger.ONE)) return "1"; if(l1.equals(BigInteger.ZERO)) return "0"; BigInteger k=BigInteger.TEN; //定义常量 BigInteger TWO = BigInteger.valueOf(2); BigInteger THREE = BigInteger.valueOf(3); while(!(l1.divide(k.divide(BigInteger.TEN)).equals(BigInteger.ZERO))) { BigInteger temp = (l1.remainder(k)).divide(k.divide(BigInteger.TEN)); if(flag){ temp.add(BigInteger.ONE); flag=false; } if(temp.equals(BigInteger.ZERO)) c+="0"; else if(temp.equals(BigInteger.ONE)) { c+="1"; } else if(temp.equals(TWO)) { c+="0"; flag =true; } else if(temp.equals(TWO)) { c+="1"; flag=true; } k=k.multiply(BigInteger.TEN); } if(flag) c+="1"; String res = ""; int len=c.length()-1; for(;len>=0;len--) { res+=c.charAt(len); } return res; } }
AC代码:
import java.math.*; public class Solution { public String addBinary(String a, String b) { String c=""; boolean flag = false; int l1=a.length()-1; int l2=b.length()-1; for(;l1>=0||l2>=0;l1--,l2--) { int temp=0; if(l1>=0&&l2>=0) temp = a.charAt(l1)-'0' + b.charAt(l2) - '0'; else if(l1<0) temp = b.charAt(l2)-'0'; else if(l2<0) temp = a.charAt(l1)-'0'; if(flag){ temp =temp + 1; flag = false;} if(temp==0) c+="0"; else if(temp==1) c+="1"; else if(temp==2) { c+="0"; flag = true; } else if(temp==3) { c+="1"; flag = true; } } if(flag) c+="1"; int len = c.length()-1; String res=""; for(;len>=0;len--) res+=c.charAt(len); return res; } }
总结:
在写代码之前,应该对你的算法有长远的认识,而不是编写编想这种目光短浅的做法。
或许,许多突如其来的BUG正是由此造成。
时间: 2024-11-05 23:32:45