題目描述:
Given two binary strings, return their sum (also a binary string).
The input strings are both non-empty and contains only characters 1
or 0
.
題目來源:leetcode
java:
1 public class Solution { 2 public String addBinary(String a, String b) { 3 StringBuilder sb = new StringBuilder(); 4 int i = a.length() - 1, j = b.length() -1, carry = 0; 5 while (i >= 0 || j >= 0) { 6 int sum = carry; 7 if (j >= 0) sum += b.charAt(j--) - '0'; 8 if (i >= 0) sum += a.charAt(i--) - '0'; 9 sb.append(sum % 2); 10 carry = sum / 2; 11 } 12 if (carry != 0) sb.append(carry); 13 return sb.reverse().toString(); 14 } 15 }
思路:
計算機二進制加法運算:
計算機計算二進制加法是分三部,第一步為將兩個加數轉換為二進制數,計算兩個加數不需要進位的和(利用異或運算 ^ ),得出的結果。第二部將兩個加數進行與運算(&)。第三部利用與運算得到結果進行左移運算(<<)(同時為計算兩個加數需要進位的和),得出結果。將或異運算的結果和左移運算的結果作為兩個新的加數,重復此操作。直到當與運算的結果為0,則異或運算的結果則為兩個加數的和所對應的二進制數。
來源:https://blog.csdn.net/gaoyubo_taili/article/details/79694729
注意事項:
- 這是一個遞歸的算法
- 結果要考慮全為0的情況
- 除去前端多余的0,用erase函數
- 剛開始就要把兩字符串的長度匹配好
全部代碼:
1 string s_xor(string a,string b) 2 { 3 int size=a.size(); 4 string c(size,'0'); 5 for(int i=0;i<size;++i) 6 { 7 if(a[i]==b[i]) c[i]='0'; 8 else c[i]='1'; 9 } 10 return c; 11 } 12 string s_and(string a,string b) 13 { 14 int size=a.size(); 15 string c(size,'0'); 16 for(int i=0;i<size;++i) 17 { 18 if(a[i]==b[i]&&a[i]=='1') c[i]='1'; 19 else c[i]='0'; 20 } 21 return c; 22 } 23 bool is_0(string a) 24 { 25 26 for(int i=0;i<a.size();++i) 27 if(a[i]!='0') return false; 28 return true; 29 } 30 class Solution { 31 public: 32 string addBinary(string a, string b) { 33 int size=a.size()>=b.size()?a.size():b.size(); 34 a=string (size-a.size(),'0')+a; 35 b=string (size-b.size(),'0')+b; 36 if(is_0(s_and(a,b))) { 37 string c=s_xor(a,b); 38 int i=0; 39 if(is_0(c)) return "0"; 40 while(c[i]=='0') 41 { 42 c.erase(c.begin()+i); 43 } 44 return c; 45 } 46 else { 47 return addBinary(s_and(a,b)+"0",s_xor(a,b)); 48 49 } 50 } 51 };