`

Leetcode - Add Binary

 
阅读更多
[分析]
从低位往高位逐位相加,就是这么一个简单的题却花了我一个多小时,无力骂自己了……
一开始想到用StringBuilder保存结果,但为了得到结果我需要每次将新算的一位insert到最前面,这样效率比较低,于是转而使用数组保存结果,数组预先开成两个字符串最大长度加1,这种coding起来其实很麻烦,要维护三个下标,很容易出错。
其实是对StringBuilder接口不熟,没有意识到它有reverse方法;
发现自己潜意识里有一口吃成胖子或者一步登天的想法,使用StringBuilder得到逆序结果就不行吗,自己再想办法逆成正确的呗;
小处的节省常常会让自己得不偿失,计算一位的结果时一开始想避免使用%,于是代码时这样的
sum.append(bitsum-2),正确的是sum.append(bitsum >= 2 ? (bitsum - 2) : bitsum)。
使用% 就不会犯这种貌似的失误,而且可读性强不是一点点,提交后发现运行时间更少(吃惊)
再说一次,先写对再优化

public class Solution {
    public String addBinary(String a, String b) {
        if (a == null || b == null)
            return a != null ? a : b;
        StringBuilder sum = new StringBuilder();
        int carry = 0;
        int i = a.length() - 1, j = b.length() - 1;
        while (i >= 0 && j >= 0) {
            int bitsum = a.charAt(i--) - '0' + b.charAt(j--) - '0' + carry;
            sum.append(bitsum % 2); 
            carry = bitsum / 2; 
        }
        while (i >= 0) {
            int bitsum = a.charAt(i--) - '0' + carry;
            sum.append(bitsum % 2); 
            carry = bitsum / 2; 
        }
        while (j >= 0) {
            int bitsum = b.charAt(j--) - '0' + carry;
            sum.append(bitsum % 2); 
            carry = bitsum / 2;
        }
        if (carry == 1)
            sum.append(1);
        return sum.reverse().toString();
    }
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics