オットセイの経営日誌

データサイエンス系ベンチャーを経営してます。経営のこと、趣味のことつぶやきます。

LeetCode / Add Binary

https://leetcode.com/problems/add-binary/

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.

Example 1:
Input: a = "11", b = "1"
Output: "100"

Example 2:
Input: a = "1010", b = "1011"
Output: "10101"

Add Binaryのタイトルの通り、Binaryの足し算です。
解けるは解けるんですが、如何にエレガントなアルゴリズムを書けるかが、コーディングインタビューでは見られるんだろうと思います。

解答・解説

解法1

まずは私の超力技のコードを示します。
いやー、見れば見るほど恥ずかしいんですが、あとで振り返ったときにこういう状態から来たんだ、と思えるように。

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        num = BinarytoInteger(a) + BinarytoInteger(b)
        ans = ''
        while num > 1:
            ans += str(num % 2)
            num = num // 2
        ans += str(num)
        ans = ''.join(list(reversed(ans)))
        return ans

def BinarytoInteger(a):
    return sum([int(e)*2**(len(a)-1-i) for i,e in enumerate(a)])
解法2

さて、ここからが本番です。。。
recursiveを使った、エレガントな解法が以下の通り。

class Solution:
    def addBinary(self, a: str, b: str) -> str:
        if len(a)==0: return b
        if len(b)==0: return a
        # 下1桁が両方1のときは、その桁は0となり1繰り上がる
        if a[-1] == '1' and b[-1] == '1':
            return self.addBinary(self.addBinary(a[0:-1],b[0:-1]),'1')+'0'
        # 下1桁が両方0のときは、その桁は0となる
        if a[-1] == '0' and b[-1] == '0':
            return self.addBinary(a[0:-1],b[0:-1])+'0'
        # 下1桁が片方0、片方1のときは、その桁は1となる
        else:
            return self.addBinary(a[0:-1],b[0:-1])+'1'

加算する2つの数の下1桁に注目し、3つの分岐で処理しています。
一番下の桁を処理したら下から2番目の桁、これを処理した下から3番目の桁、と順に遡っていくrecursiveな処理をしています。