題型解說
這是一題難度為簡單的題目
需要設計一個方法,此方法會傳入兩個字串 a 和 b,字串內容是二進制(只有 0 和 1)
將兩個字串的二進制內容相加後回傳
範例:
a = "11", b = "1",則回傳 "100",因為 11 + 1 = 100
a = "1010", b = "1011",則回傳 "10101"
解題思路
跟之前的一些題目一樣,有字串解跟數字解兩種方式
字串解比較直覺,但效能較差一些,程式碼也會多一些
兩種解同樣都是從字串最後面往回歷遍,等同於加法方式,由右到左
程式碼
Java
class Solution {
public String addBinary(String a, String b) {
int index1 = a.length() -1;
int index2 = b.length() -1;
StringBuilder sb = new StringBuilder();
boolean flag = false;
while (index1 > -1 || index2 > -1) {
if (flag) { // 有進位
if (index1 > -1 && index2 > -1) {
char c1 = a.charAt(index1--);
char c2 = b.charAt(index2--);
if (c1 == '0' && c2 == '0') {
sb.insert(0, '1');
flag = false;
} else if (c1 == '1' && c2 == '1') {
sb.insert(0, '1');
} else {
sb.insert(0, '0');
}
} else if (index1 > -1) {
switch (a.charAt(index1--)) {
case '0':
sb.insert(0, '1');
flag = false;
break;
case '1':
sb.insert(0, '0');
break;
}
} else {
switch (b.charAt(index2--)) {
case '0':
sb.insert(0, '1');
flag = false;
break;
case '1':
sb.insert(0, '0');
break;
}
}
continue;
}
if (index1 > -1 && index2 > -1) {
char c1 = a.charAt(index1--);
char c2 = b.charAt(index2--);
if (c1 == '0' && c2 == '0') {
sb.insert(0, '0');
} else if (c1 == '1' && c2 == '1') {
sb.insert(0, '0');
flag = true;
} else {
sb.insert(0, '1');
}
} else if (index1 > -1) {
sb.insert(0, a.charAt(index1--));
} else {
sb.insert(0, b.charAt(index2--));
}
}
if (flag) {
sb.insert(0, '1');
}
return sb.toString();
}
}
class Solution {
public String addBinary(String a, String b) {
int index1 = a.length() -1;
int index2 = b.length() -1;
StringBuilder sb = new StringBuilder();
int sum = 0;
while (index1 > -1 || index2 > -1) {
if (index1 > -1) {
sum += a.charAt(index1--) - '0';
}
if (index2 > -1) {
sum += b.charAt(index2--) - '0';
}
sb.insert(0, sum %2);
sum /= 2;
}
if (sum > 0) {
sb.insert(0, '1');
}
return sb.toString();
}
}