LeetCode --- 67.二進(jìn)制求和

LeetCode --- 字符串、數(shù)組
簡(jiǎn)書專欄:http://www.itdecent.cn/nb/41796568
知乎專欄:https://zhuanlan.zhihu.com/c_174823416

一、題目描述

來(lái)源:力扣(LeetCode)
給定兩個(gè)二進(jìn)制字符串,返回他們的和(用二進(jìn)制表示)。
輸入為非空字符串且只包含數(shù)字 1 和 0。

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

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

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

  • 首先明確兩個(gè)數(shù)相加,是從后往前加,那么可以定義兩個(gè)指針i,j從后向前遍歷,直到其中一個(gè)小于0的時(shí)候結(jié)束循環(huán)。相加的關(guān)鍵是在于處理進(jìn)位的問(wèn)題。
  • 單獨(dú)定義一個(gè)變量up來(lái)控制,當(dāng)兩數(shù)之和加上up大于1時(shí),表明需要向后進(jìn)位,向結(jié)果字符串的首位置插入當(dāng)前總和減去2(因因?yàn)榭偤痛笥?,說(shuō)明可能是1+1+1或1+1+0的形式,減去2之后即為進(jìn)位之后留在此處的數(shù)字)。
  • 否則表明不需要進(jìn)位,直接在字符串首位插入該總和。
  • 結(jié)合代碼加以理解
  public static String addBinary(String a, String b) {
        int i = a.length() - 1;
        int j = b.length() - 1;

        StringBuffer br = new StringBuffer();
        //定義進(jìn)位變量
        int up = 0;
        //定義相加之和
        int sum = 0;
        //注意這里用的是或,不是且,因?yàn)槿绻麅蓚€(gè)字符串長(zhǎng)度不一致,剩余的也要加上去
        while (i >= 0 || j >= 0) {
            //上次的進(jìn)位作為本次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);
        }

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

更為簡(jiǎn)潔的代碼:

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();
    }

三、測(cè)試代碼

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));
    }

輸出結(jié)果為:

100
10000
最后編輯于
?著作權(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)容