莫非深夜真的coder最有灵感的时候?
题目:
/**
* Given two binary strings, return their sum (also a binary string).
* For example,
* a = "11"
* b = "1"
* Return "100".
* */
思路:
1.当字符串有一个为空或者为0时,相当于答案取决于另一个
2.如果字符串a、b相等,相当于*2 那么就是左移一位
3.String转字符串数组,比较长短(考虑到最后一位可能进位,因此用stringbuffer顺序保存,再reverse)
遍历长数组,从尾部开始与短数组比较,并且定义一变量保存进位;
当两位字符相同时,结果取决于进位,而当前进位值取决于该字符值;
当两位字符不同时,结果取决于进位与'1'的想加,而进位值保持不变;
只剩下长数组时,其实我想是否可以判断进位是否为'0',如果是,则长数组剩下部分不需要改动;
否则需要进位//这部分还没去认真想。
public class AddBinary {
public String addBinary(String a, String b) {
// Start typing your Java solution below
// DO NOT write main() function
if("".equals(a)||"0".equals(a)){//一个为0或者为空的情况
return ("".equals(b))?"0":b;
}
if("".equals(b)||"0".equals(b)){
return ("".equals(a))?"0":a;
}
if(a.equals(b)){//两个相等直接左移
return (a+"0");
}
int llength = a.length();
int slength = b.length();//感觉这两个变量应该优化的
StringBuffer sb = new StringBuffer();
char[] achars =null;//命名有问题,其实代表最长
char[] bchars=null;
if(llength>=slength){
achars = a.toCharArray();
bchars = b.toCharArray();
}else{
achars = b.toCharArray();
bchars = a.toCharArray();
}
char c='0';//因为开始时放在for里面,导致忽略了c是char而声明成了int出了不少错
for(int i=achars.length-1,j=bchars.length-1;i>=-1;i--){//考虑最后进位
if(j>-1){//一长一短,短的没遍历完前
if(achars[i]==bchars[j]){//两个数相等,必然要么进1要么不进,结果取决于进位值
sb.append(c);
c = achars[i];//既然相等,那都为1时必然进位
}else{
sb.append(c=='0'?'1':'0');//不相等时,肯定是有个1的,然后跟进位想加,所以结果取决于c,而进位不变
}
j--;
}else if(i>=0&&achars[i]=='0'){//剩下的长的,能优化不?
sb.append(c);
c = '0';
}else if(i>-1){
sb.append(c=='0'?'1':'0');
}else{
if(c=='1'){
sb.append('1');
}
}
}
return sb.reverse().toString();//倒转再转string
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
AddBinary ab = new AddBinary();
ab.addBinary("1010", "1011");
ab.addBinary("11", "1");
}
}
昨晚睡前草稿想到了算法,今晚晚回来,先游戏一下,然后看了下kobe的视频,所以晚了,编完码刚调试,尼玛就已经整点了,坑爹啊,然后坚持到debug成功为止。顺便写下blog,这个应该可以优化下,明天再想想。官网运行结果图: