給定兩個二進制字串 a、b,回傳它們相加後的二進制字串。輸入非空、僅含 '0'/'1'、無前導零(除 "0" 本身)。
從最低位(字串末尾)向最高位遍歷,維護進位 carry,逐位計算:
sum = (a[i]-'0') + (b[j]-'0') + carry resultBit = sum % 2 carry = sum / 2
public String addBinary(String a, String b) {
char[] aa = a.toCharArray(), bb = b.toCharArray();
int size = Math.max(aa.length, bb.length);
int[] mm = new int[size];
int c = 0, i = aa.length-1, j = bb.length-1, k = size-1;
// 同時遍歷兩字串
for (; i>=0 && j>=0; i--, j--, k--) {
mm[k] = (aa[i]-'0' + bb[j]-'0' + c) % 2;
c = (aa[i]-'0' + bb[j]-'0' + c >= 2) ? 1 : 0;
}
// 處理剩餘長字串
while (i >= 0) { mm[k] = (aa[i]-'0' + c) % 2; c = (aa[i]-'0' + c >= 2) ? 1 : 0; k--; i--; }
while (j >= 0) { mm[k] = (bb[j]-'0' + c) % 2; c = (bb[j]-'0' + c >= 2) ? 1 : 0; k--; j--; }
// 最高位進位
String s = (c == 1) ? "1" : "";
for (int n = 0; n < mm.length; n++) s += mm[n];
return s;
}
問題:
aa[i]-'0' 等表達式,可讀性差。s += mm[n] 在循環中產生大量臨時對象,效率低(O(N²))。public String addBinary(String a, String b) {
StringBuilder sb = new StringBuilder();
int i = a.length() - 1, j = b.length() - 1, carry = 0;
while (i >= 0 || j >= 0 || carry > 0) {
int sum = carry;
if (i >= 0) sum += a.charAt(i--) - '0';
if (j >= 0) sum += b.charAt(j--) - '0';
sb.append(sum & 1); // sum % 2
carry = sum >> 1; // sum / 2
}
return sb.reverse().toString();
}
i>=0 || j>=0 || carry>0 統一處理所有情況,無需分段。sum & 1 替代 %2,sum >> 1 替代 /2,極快。reverse() 得到正序。toCharArray() 複製陣列。若允許庫函數,一行解決:
return new BigInteger(a, 2).add(new BigInteger(b, 2)).toString(2);
面試中建議先寫模擬版展示基本功,再補充庫函數作為工程實踐選項。