LeetCode 67. 二进制求和

67. 二进制求和

题目分析

这个题很明显就是对字符串的每一个位进行操作,思想也很简单啊,主要还是考验代码风格吧。
我们只需要从右到左每个位进行判断,然后填入新的字符串中,最后进行返回即可。

实现代码

class Solution {
    public String addBinary(String a, String b) {
        //先将字符串转化成字符数组,方便操作。
        char[] str_a = a.toCharArray();
        char[] str_b = b.toCharArray();
        int i = str_a.length-1;
        int j = str_b.length-1;
        int count = 0;
        //使用stringbuilder可以方便插入
        StringBuilder sb = new StringBuilder();
        //先对两者都有的部分进行加法操作。
        while(i >= 0 && j >= 0){
            //注意这里被坑了好久,获取当前位应该使用异或操作而不是或操作
            //例如1+1+0,或操作就会变成1,异或会变成0
            sb.insert(0, (str_a[i] - '0') ^ (str_b[j] - '0') ^ count);
            //求进位的时候反而是使用或操作,因为这里a,b,count三者之中有两个为1,就代表当前位产生了进位。
            count = ((str_a[i] - '0') & (str_b[j] - '0')) | ((str_a[i] - '0' & count) | (str_b[j] - '0' & count));
            i--;
            j--;
        }
        //处理较长字符串剩余的字符,同样要注意进位和加法之间的不同操作。
        while(i >= 0){
            sb.insert(0,(str_a[i] - '0') ^ count);
            count = (str_a[i] & count);
            i--;
        }
        while(j >= 0){
            sb.insert(0,(str_b[j] - '0') ^ count);
            count &= (str_b[j] - '0');
            j--;
        }
        //防止还有最高位进位的出现,这里无论0,1都加入,因为下面还会进行前置0的去除,所以问题不大。
        sb.insert(0,count);
        int index = 0;
        //注意这里只能遍历到倒数第二个位,因为测试用例中有0+0的情况,所以最少都要保留一个0.
        while(index < sb.length()-1 && sb.charAt(index) == '0'){
            index++;
        }
        //裁剪返回。
        return sb.toString().substring(index);
    }
}

上面这个写法是我自己写出来的,写的时间很长,并且代码的量也比较大,其实仔细看看我们这个代码里面还是有可以压缩的地方的,比如说我们三个while循环可以压缩成一个while循环,因为其实这里都是在干同样的事情。
优化后的代码如下

class Solution {
    public String addBinary(String a, String b) {
        int c = 0, i = a.length() - 1, j = b.length() - 1;
        StringBuilder sb = new StringBuilder();
        char[] charA = a.toCharArray();
        char[] charB = b.toCharArray();
        while (c > 0 || i >= 0 || j >= 0){
            int valA = i >= 0 ? charA[i--] - '0' : 0;
            int valB = j >= 0 ? charB[j--] - '0' : 0;
            int sum = valA + valB + c;
            c = sum >> 1;
            sb.append(sum % 2);
        }   
        return sb.reverse().toString();
    }
}
原文地址:https://www.cnblogs.com/ZJPaang/p/13180644.html