Leetcode - Add Binary

Paste_Image.png

My code:

public class Solution {
    public String addBinary(String a, String b) {
        if (a == null || a.length() == 0 || b == null || b.length() == 0)
            return null;
        int len = Math.max(a.length(), b.length()) + 1;
        String aReverse = "";
        for (int i = a.length() - 1; i >= 0; i--)
            aReverse += a.charAt(i);
        String bReverse = "";
        for (int i = b.length() - 1; i >= 0; i--)
            bReverse += b.charAt(i);
        byte[] carry = new byte[len];
        for (int i = 0; i < len - 1; i++) {
            if (i >= Math.min(aReverse.length(), bReverse.length())) {
                if (aReverse.length() >= bReverse.length()) {
                    byte sum = (byte) (aReverse.charAt(i) - 0x30 + carry[i]);
                    carry[i + 1] = (byte) (sum >> 0x01);
                    carry[i] = (byte) (sum & 0x01);
                }
                else {
                    byte sum = (byte) (bReverse.charAt(i) - 0x30 + carry[i]);
                    carry[i + 1] = (byte) (sum >> 0x01);
                    carry[i] = (byte) (sum & 0x01);
                }
            }
            else {
                byte sum = (byte) (aReverse.charAt(i) - 0x30 + bReverse.charAt(i) - 0x30 + carry[i]);
                carry[i + 1] = (byte) (sum >> 0x01);
                carry[i] = (byte) (sum & 0x01);
            }
        }
        int resultLen = 0;
        if (carry[len - 1] == 0)
            resultLen = len - 1;
        else
            resultLen = len;
        String resultStr = "";
        for (int i = 0 ; i < resultLen; i++)
            resultStr += (char) (carry[resultLen - i - 1] + 0x30);
        for (int i = 0; i < resultStr.length(); i++) {
            if (resultStr.charAt(0) == '0') {
                if (i != resultLen - 1)
                    resultStr = resultStr.substring(1, resultStr.length());
            }
            else
                break;
        }
        return resultStr;
    }
    
    public static void main(String[] args) {
        Solution test = new Solution();
        System.out.println(test.addBinary("011", "1"));
    }
}

My test result:

Paste_Image.png

這次作業(yè)不難,但是有些細(xì)節(jié)要注意下。
首先是,Java 比特級(jí)操作。
無(wú)論是移位操作,還是加減操作,最后都會(huì)轉(zhuǎn)換為int類型,進(jìn)行處理,所以返回值都是int,如果需要進(jìn)行比特操作,還需要對(duì)結(jié)果強(qiáng)制轉(zhuǎn)換下。

Paste_Image.png

還有個(gè)地方就是,需要考慮哪個(gè)加數(shù)更長(zhǎng)些,然后對(duì)這個(gè)情況進(jìn)行處理,防止溢出。
差不多就這樣了。
下面粘貼一個(gè)Java 位操作的的博客。
http://dogstar.iteye.com/blog/227625

**
總結(jié):Java 位操作,返回仍是 int, 需要再次進(jìn)行強(qiáng)制轉(zhuǎn)換為byte。
**

Anyway, Good luck, Richardo!

My code:

public class Solution {
    public String addBinary(String a, String b) {
        if (a == null || a.length() == 0)
            return b;
        else if (b == null || b.length() == 0)
            return a;
        /** reverse string for plus */  
        StringBuilder p1 = new StringBuilder(a);
        p1 = p1.reverse();
        StringBuilder p2 = new StringBuilder(b);
        p2 = p2.reverse();
        
        int carry = 0;
        StringBuilder ret = new StringBuilder();
        int i = 0;
        int j = 0;
        while (i < p1.length() || j < p2.length()) {
            if (i >= p1.length()) {
                int sum = p2.charAt(j) - 48 + carry;
                carry = sum / 2;
                ret.append(sum % 2);
                j++;
            }
            else if (j >= p2.length()) {
                int sum = p1.charAt(i) - 48 + carry;
                carry = sum / 2;
                ret.append(sum % 2);
                i++;
            }
            else {
                int sum = p1.charAt(i) - 48 + p2.charAt(i) - 48 + carry;
                carry = sum / 2;
                ret.append(sum % 2);
                i++;
                j++;
            }
        }
        if (carry != 0)
            ret.append(carry);
        return ret.reverse().toString();
    }
}

感覺(jué)這次的代碼簡(jiǎn)單理解好多。
和剛剛那道題目,

  1. Add Two Numbers
    http://www.itdecent.cn/p/37d4945d5e61
    很像。
    也是反轉(zhuǎn)下。然后加起來(lái)。結(jié)果再反轉(zhuǎn)回去。
    注意, '0' 的十進(jìn)制值是 48, OX30

Anyway, Good luck, Richardo!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容