LeetCode --- 67.二進制求和

LeetCode --- 字符串弛姜、數(shù)組
簡書專欄:http://www.reibang.com/nb/41796568
知乎專欄:https://zhuanlan.zhihu.com/c_174823416

一皮服、題目描述

來源:力扣(LeetCode)
給定兩個二進制字符串大磺,返回他們的和(用二進制表示)芙委。
輸入為非空字符串且只包含數(shù)字 1 和 0。

示例:
輸入: a = "11", b = "1"
輸出: "100"

輸入: a = "1010", b = "1011"
輸出: "10101"

二、實現(xiàn)思路以及代碼

  • 首先明確兩個數(shù)相加,是從后往前加院尔,那么可以定義兩個指針i,j從后向前遍歷蜻展,直到其中一個小于0的時候結束循環(huán)。相加的關鍵是在于處理進位的問題邀摆。
  • 單獨定義一個變量up來控制纵顾,當兩數(shù)之和加上up大于1時,表明需要向后進位栋盹,向結果字符串的首位置插入當前總和減去2(因因為總和大于1施逾,說明可能是1+1+1或1+1+0的形式,減去2之后即為進位之后留在此處的數(shù)字)例获。
  • 否則表明不需要進位汉额,直接在字符串首位插入該總和。
  • 結合代碼加以理解
  public static String addBinary(String a, String b) {
        int i = a.length() - 1;
        int j = b.length() - 1;

        StringBuffer br = new StringBuffer();
        //定義進位變量
        int up = 0;
        //定義相加之和
        int sum = 0;
        //注意這里用的是或榨汤,不是且蠕搜,因為如果兩個字符串長度不一致,剩余的也要加上去
        while (i >= 0 || j >= 0) {
            //上次的進位作為本次sum的初始值
            sum = up;
            if (i >= 0) {
                sum += a.charAt(i) - '0';
                i--;
            }
            if (j >= 0) {
                sum += b.charAt(j) - '0';
                j--;
            }

            if (sum > 1) {
                up = 1;
                sum -= 2;
            } else {
                up = 0;
            }
            br.insert(0, sum);
        }

        //最后一位進位要加上
        if (up == 1) {
            br.insert(0, 1);
        }
        return br.toString();
    }

更為簡潔的代碼:

public String addBinary(String a, String b) {
        StringBuffer sb = new StringBuffer();
        int i = a.length() - 1, j = b.length() - 1;
        int carry = 0;
        while(i >= 0 || j >=0) {
            int ta = i >= 0 ? (a.charAt(i) - '0') : 0;
            int tb = j >= 0 ? (b.charAt(j) - '0') : 0;
            int sum = ta + tb + carry;
            carry = sum / 2;
            sum = sum % 2;
            sb.append(sum);
            i--;
            j--;
        }
        if(carry == 1) {
            sb.append("1");
        }
        return sb.reverse().toString();
    }

三收壕、測試代碼

public static void main(String[] args) {
        String a = "11";
        String b = "1";
        System.out.println(addBinary(a, b));

        a = "1101";
        b = "11";
        System.out.println(addBinary(a, b));
    }

輸出結果為:

100
10000
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末讥脐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子啼器,更是在濱河造成了極大的恐慌,老刑警劉巖俱萍,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件端壳,死亡現(xiàn)場離奇詭異,居然都是意外死亡枪蘑,警方通過查閱死者的電腦和手機损谦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岳颇,“玉大人照捡,你說我怎么就攤上這事』安啵” “怎么了栗精?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瞻鹏。 經(jīng)常有香客問我悲立,道長,這世上最難降的妖魔是什么新博? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任薪夕,我火速辦了婚禮,結果婚禮上赫悄,老公的妹妹穿的比我還像新娘原献。我一直安慰自己馏慨,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布姑隅。 她就那樣靜靜地躺著写隶,像睡著了一般。 火紅的嫁衣襯著肌膚如雪粤策。 梳的紋絲不亂的頭發(fā)上樟澜,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音叮盘,去河邊找鬼秩贰。 笑死,一個胖子當著我的面吹牛柔吼,可吹牛的內容都是我干的毒费。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼愈魏,長吁一口氣:“原來是場噩夢啊……” “哼觅玻!你這毒婦竟也來了?” 一聲冷哼從身側響起培漏,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤溪厘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后牌柄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畸悬,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年珊佣,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹋宦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡咒锻,死狀恐怖冷冗,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情惑艇,我是刑警寧澤蒿辙,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站敦捧,受9級特大地震影響须板,放射性物質發(fā)生泄漏。R本人自食惡果不足惜兢卵,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一习瑰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧秽荤,春花似錦甜奄、人聲如沸柠横。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牍氛。三九已至,卻和暖如春烟阐,著一層夾襖步出監(jiān)牢的瞬間搬俊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工蜒茄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留唉擂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓檀葛,卻偏偏與公主長得像玩祟,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子屿聋,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內容