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è)不難答姥,但是有些細節(jié)要注意下铣除。
首先是,Java 比特級操作鹦付。
無論是移位操作尚粘,還是加減操作,最后都會轉(zhuǎn)換為int類型敲长,進行處理背苦,所以返回值都是int互捌,如果需要進行比特操作,還需要對結(jié)果強制轉(zhuǎn)換下行剂。

Paste_Image.png

還有個地方就是秕噪,需要考慮哪個加數(shù)更長些,然后對這個情況進行處理厚宰,防止溢出腌巾。
差不多就這樣了。
下面粘貼一個Java 位操作的的博客铲觉。
http://dogstar.iteye.com/blog/227625

**
總結(jié):Java 位操作澈蝙,返回仍是 int, 需要再次進行強制轉(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();
    }
}

感覺這次的代碼簡單理解好多灯荧。
和剛剛那道題目,

  1. Add Two Numbers
    http://www.reibang.com/p/37d4945d5e61
    很像盐杂。
    也是反轉(zhuǎn)下逗载。然后加起來。結(jié)果再反轉(zhuǎn)回去链烈。
    注意厉斟, '0' 的十進制值是 48, OX30

Anyway, Good luck, Richardo!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市强衡,隨后出現(xiàn)的幾起案子擦秽,更是在濱河造成了極大的恐慌,老刑警劉巖漩勤,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件感挥,死亡現(xiàn)場離奇詭異,居然都是意外死亡越败,警方通過查閱死者的電腦和手機触幼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來眉尸,“玉大人域蜗,你說我怎么就攤上這事巨双≡牖” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵筑累,是天一觀的道長袱蜡。 經(jīng)常有香客問我,道長慢宗,這世上最難降的妖魔是什么坪蚁? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任奔穿,我火速辦了婚禮,結(jié)果婚禮上敏晤,老公的妹妹穿的比我還像新娘贱田。我一直安慰自己,他們只是感情好嘴脾,可當我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布男摧。 她就那樣靜靜地躺著,像睡著了一般译打。 火紅的嫁衣襯著肌膚如雪耗拓。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天奏司,我揣著相機與錄音乔询,去河邊找鬼。 笑死韵洋,一個胖子當著我的面吹牛竿刁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播麻献,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼们妥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了勉吻?” 一聲冷哼從身側(cè)響起监婶,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎齿桃,沒想到半個月后惑惶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡短纵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年带污,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片香到。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡露筒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蒙具,到底是詐尸還是另有隱情例诀,我是刑警寧澤,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布梗脾,位于F島的核電站荸型,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏炸茧。R本人自食惡果不足惜瑞妇,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一稿静、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辕狰,春花似錦改备、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至柬脸,卻和暖如春他去,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背倒堕。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工灾测, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人垦巴。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓媳搪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骤宣。 傳聞我的和親對象是個殘疾皇子秦爆,可洞房花燭夜當晚...
    茶點故事閱讀 44,601評論 2 353

推薦閱讀更多精彩內(nèi)容