題67:類型:字符串翠胰、數(shù)學(xué)
- 題目:給你兩個(gè)二進(jìn)制字符串吏夯,返回它們的和(用二進(jìn)制表示)样屠。
輸入為 非空 字符串且只包含數(shù)字 1 和 0。
示例 1: 輸入: a = "11", b = "1"--->輸出: "100"
示例 2: 輸入: a = "1010", b = "1011"--->輸出: "10101"
提示:
1葛菇、每個(gè)字符串僅由字符 '0' 或 '1' 組成意鲸。
2廓鞠、1 <= a.length, b.length <= 10^4
3口四、字符串如果不是 "0" ,就都不含前導(dǎo)零穆律。
-
解題步驟
- 將兩個(gè)字符串末尾對齊惠呼,以較長字符串的長度進(jìn)行 從后向前 的遍歷,較短的字符串用 0 補(bǔ)齊峦耘;
- 將(同一位置的兩串之和加上一位進(jìn)位)對2取余后剔蹋,添加到新字符串的尾部,同時(shí)保留進(jìn)位辅髓,作為下一位置的初始泣崩;
- 遍歷結(jié)束后,若最終進(jìn)位為1利朵,則向新字符串尾部添加 '1';
4.最后將新字符倒轉(zhuǎn)猎莲。
class Solution {
public String addBinary(String a, String b) {
// 單線程可變字符用StringBuilder
StringBuilder res = new StringBuilder();
int carry = 0; // 進(jìn)位初始為0
int n = Math.max(a.length() , b.length());
for(int i = 0;i < n ;++i){ // ++i 內(nèi)存空間消耗小
// 進(jìn)位賦值绍弟,短串不足的部分取0,carry =a+b+上一位的進(jìn)位
carry += i < a.length() ? (a.charAt(a.length() - 1 - i) - '0') : 0;
// 由ASCII碼方法轉(zhuǎn)換為int類型 char 著洼?-'0' ---> int ?
carry += i < b.length() ? (b.charAt(b.length() - 1 - i) - '0') : 0;
//轉(zhuǎn)換為字符添加到結(jié)果字符串中
res.append((char)carry % 2);
carry /= 2; // 保留進(jìn)制樟遣,2取1, 0/1取0
}
//最終進(jìn)位判斷
if(carry == 1){
res.append('1');
}
res.reverse();
return res.toString();
}
}
小知識(shí):i++ :先在i所在的表達(dá)式中使用i的當(dāng)前值而叼,后讓i加1;
++i :讓i先加1豹悬,然后在i所在的表達(dá)式中使用i的新值
i++由于是在使用當(dāng)前值之后再+1葵陵,所以會(huì)需要一個(gè)臨時(shí)變量來轉(zhuǎn)儲(chǔ),而++則直接+1瞻佛,不存在這樣的問題脱篙。