67.バイナリシークとJavaScript


67.バイナリ加算
二つのバイナリ文字列をあげて、それらの和を返します.
空の文字列ではなく、数字1と0だけを入力します.
例1:
  : a = "11", b = "1"
  : "100"
例2:
  : a = "1010", b = "1011"
  : "10101"
ヒント:
  • の各文字列は、文字‘0’または‘1’だけで構成される.
  • <=a.length、b.length<=10^4
  • 文字列は、「0」でなければ、プリアンブルゼロを含まない.
  • バイナリ加算の法則:
    0+0=0、0+1=1、1+0=1、1+1=10、つまり2つの加算のバイナリビットが1桁だけの場合、加算の結果は1です.二つのバイナリビットが全部0なら、加算の結果はまだ0です.2つの加算のバイナリビットが1であれば、結果は10(10進数の2に相当)、つまり「2進1」ルールであり、10進数の「10進1に会う」と同じです.
    思考全体の考え方は、2つの文字列の短い部分を00で補完し、2つの文字列の長さが一致するようにして、最後から巡回して計算して、最終的な結果を得ます.
    この問題の大体の考えは上記と一致していますが、文字列の操作の原因で、最後の結果が一人の進数を増やすかどうかは分かりません.
    計算時に文字列を直接つづり合わせると、逆の文字が得られます.最後に反転します.
    時間複雑度:O(n)O(n)
    /**
     * @param {string} a
     * @param {string} b
     * @return {string}
     */
    var addBinary = function(a, b) {
        let ans = "";
        let ca = 0;
        for(let i = a.length - 1, j = b.length - 1;i >= 0 || j >= 0; i--, j--) {
            let sum = ca;
            sum += i >= 0 ? parseInt(a[i]) : 0;
            sum += j >= 0 ? parseInt(b[j]) : 0;
            ans += sum % 2;
            ca = Math.floor(sum / 2);
        }
        ans += ca == 1 ? ca : "";
        return ans.split('').reverse().join('');
    };
    
    
    つの拒絶される小さい技巧——BigInt
    var addBinary = function(a, b) {
     	return (BigInt("0b" + a) + BigInt("0b" + b)).toString(2);
    }