leetcode004:add binary

来源:互联网 发布:php 报名缴费 源码 编辑:程序博客网 时间:2024/06/03 22:50

莫非深夜真的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 stubAddBinary ab = new AddBinary();ab.addBinary("1010", "1011");ab.addBinary("11", "1");}}

昨晚睡前草稿想到了算法,今晚晚回来,先游戏一下,然后看了下kobe的视频,所以晚了,编完码刚调试,尼玛就已经整点了,坑爹啊,然后坚持到debug成功为止。顺便写下blog,这个应该可以优化下,明天再想想。官网运行结果图:


原创粉丝点击