LeetCode 67. Add Binary
題目
Given two binary strings, return their sum (also a binary string).
For example, a = "11" b = "1" Return "100".
翻譯
給兩個字元字串,回傳他們的總和(以字元字串回傳)。
範例:
a = '11'
b = '1'
return '100'
思路
- 一開始的想法是將a,b轉為數字,相加後再轉回bits,程式碼在下面,不過題目給的string長度轉成int時會超過int max,所以這個方法不能用
- 改用純字串來處理,先處理位數一樣的部分,ex. "111"+"10" ,先處理"11"+"10"
- 以 "11"+"10"為例,個位數1+0=1; 十位數1+1=2,因為bits是二進位,因此2->0,然後儲存進位資訊,這時候要回傳的字串為'10'
- "111"最前面的"1"+剛才的進位1 = 2, 2-> 0 , 會傳字串為'010'
- 因為剛才還有進位,所以要把進位的1加到字串前面,最後回傳'1010'
解題
/**
* @param {string} a
* @param {string} b
* @return {string}
*/
var addBinary = function(a, b) {
// 使用字串來處理
var sumStr = "";
var carry = 0;
var longStr, shortStr;
// 判斷a,b哪個字串比較長
if(a.length > b.length){
longStr = a;
shortStr = b;
} else {
longStr = b;
shortStr = a;
}
longStr = longStr.split("").reverse().join("");
shortStr = shortStr.split("").reverse().join("");
// 將短字串加到長字串裡面,這邊先計算到短字串的位數,ex. "110" + "1111",這邊先處理 "110" + "111"
for(var i = 0 ; i < shortStr.length ; i++) {
var c = parseInt(shortStr.charAt(i))+parseInt(longStr.charAt(i)) + carry;
// 二進位,相加大於1,就要進位
if(c > 1){
carry = 1;
c = c%2;
} else {
carry = 0;
}
sumStr = c + sumStr;
}
// 處理長字串剩下的字串
for(var j = shortStr.length ; j < longStr.length ; j ++){
var c = parseInt(longStr.charAt(j)) + carry;
if(c > 1){
carry = 1;
c = c%2;
} else {
carry = 0;
}
sumStr = c + sumStr
}
// 如果加完後還有進位,要放到字串最前面
return (carry == 1 ? carry : "") + sumStr;
};
失敗的解題
var addBinary = function(a, b) {
var sum = parseInt(a,2)+parseInt(b,2);
var bitStr = "";
while(sum > 0){
bitStr = sum%2 + bitStr;
sum = Math.floor(sum/2);
}
return bitStr == '' ? '0': bitStr ;
}