題目:
Given two binary strings, return their sum (also a binary string).
思路與步驟:
原思路:
將兩個string逐個字符相加,設置一個flag ,進位的話記 carry=1,反之 carry=0
需要處理的一些細節:
1. a 和 b 的 0, 1 是字符形式,要寫成 '0', '1';flag 是 int 型,寫成 0, 1.
2. 最後一位(即最高位)加完後若 carry 爲1需要給 和 的最高位設爲1,即 和 的位數比a和b中較大位數還多1.
3. 如果a和b的高位有0,加完之後要把和高位上的0去掉。
改進的思路:
看了別人的代碼後發現原來的思路過於繁瑣,現學習別人的簡潔思路:
1. 用 StringBuilder sb = new StringBuilder();
2. StringBuilder可以append 進 int 型的元素;由於二進制的含義是滿 2 進 1,所以還是採用加法運算。
如果和爲2,則carry 爲1,即 sum/2,sb 中加入的元素爲0,即sum%2;和爲1和0時情況一樣。
編程遇到的問題:
1. 開始用的 char[] 型來儲存和,加的時候從最低位開始,即數組下標最大處開始。結果發現由於最高位是否進1不確定,即數組的大小不確定,沒有辦法初始化數組,所以這個數據結構的選取失敗。
2. 後來想到用 Stack ,但是最後返回是首先是無法轉化成數組,然後發現輸出的順序並不是從棧頂開始(爲什麼,還沒解決)。
3. 既然 stack 無法逆轉,想到用 List ,解決了逆轉的問題,即 Collections.reverse(myList); 最後遇到的問題是無法將List 轉化成 String。此時我已經黔驢技窮,所以看了別人的解法,get了新的知識。
新知識學習:
StringBuilder
常用方法有:append(); length(); charAt(i); deleteCharAt(i); toString() 等。
編程實現:
我的囉嗦但很快的代碼:
public class Solution {
public String addBinary(String a, String b) {
char[] achar = a.toCharArray();
char[] bchar = b.toCharArray();
int i = a.length()-1, j = b.length()-1, carry = 0;
StringBuilder sb = new StringBuilder();
for( ; i>=0 && j>=0; i--,j--){
if (achar[i] != bchar[j]) sb.append(carry==0 ? '1' : '0');
else if (achar[i]=='0' && bchar[j]=='0'){
sb.append(carry==0 ? '0' : '1');
carry = 0;
} else if (achar[i]=='1' && bchar[j]=='1'){
sb.append(carry==0 ? '0' : '1');
carry = 1;
}
}
while(i > j){
for( ; i>=0 && carry == 0; i--) sb.append(achar[i]);
for( ; i>=0 && carry == 1; i--){
sb.append(achar[i] == '0' ? '1' : '0');
carry = (achar[i] == '0' ? 0 : 1);
}
}
while(i < j){
for( ; j>=0 && carry == 0; j--) sb.append(bchar[j]);
for( ; j>=0 && carry == 1; j--){
sb.append(bchar[j] == '0' ? '1' : '0');
carry = (bchar[j] == '0' ? 0 : 1);
}
}
if(carry==1) sb.append('1');
sb.reverse();
while(sb.length()>1 && sb.charAt(0)=='0') sb.deleteCharAt(0);
return sb.toString();
}
}
學習別人的代碼:
public class Solution {
public String addBinary(String a, String b) {
char[] achar = a.toCharArray();
char[] bchar = b.toCharArray();
int i = a.length()-1, j = b.length()-1, carry = 0;
StringBuilder sb = new StringBuilder();
while (i >= 0 || j >= 0) {
int sum = carry;
if (i >= 0) sum += achar[i--]-'0';
if (j >= 0) sum += bchar[j--]-'0';
sb.append(sum % 2);
carry = sum / 2;
}
if (carry == 1) sb.append(carry);
return sb.reverse().toString();
}
}