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正是由此造成。