ゼロから始めるLeetCode Day54 「1290. Convert Binary Number in a Linked List to Integer」

概要

海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。

と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。

ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

Leetcode

Python3で解いています。
Twitterやってます。

ゼロから始めるLeetCode 目次

前回
ゼロから始めるLeetCode Day53 「1365. How Many Numbers Are Smaller Than the Current Number」
次回
ゼロから始めるLeetCode Day55「22. Generate Parentheses」

Twitterやってます。

問題

1290. Convert Binary Number in a Linked List to Integer

難易度はEasy。

問題としては、単方向の連結リストheadが与えられます。
各ノードは01を値として持っており、それらを2進法の値として扱います。ここではそれらの二進法表記の値を10進法に直し、数字を返すアルゴリズムを設計してください、というものです。

Input: head = [1,0,1]
Output: 5
Explanation: (101) in base 2 = (5) in base 10

Input: head = [0]
Output: 0

Input: head = [1]
Output: 1

Input: head = [1,0,0,1,0,0,1,1,1,0,0,0,0,0,0]
Output: 18880

Input: head = [0,0]
Output: 0

解法

進数変換はちょいちょいあるネタな気がします。
最初は面食らうかもしれませんが、よくよく見てみるとワンパターンなことが多いので問題を解いて慣れてしまうことをお勧めします、

この問題での大事なのは、

  • 連結リストの要素を全て網羅する
  • 二進数から十進数へと変換する

という点なので、そこについて理解できていれば簡単かもしれません。

配列を用意し、配列へ追加、次の要素へ移動、というのをwhile文で書いてあげれば事足りそうです。

進数変換ですが、例えば、Pythonでは、
int('10',2)
といった形で書くと2進数を10進数に変換してくれるため、それを使えば変換自体は簡単です。

詳しく知りたい方は[公式ドキュメント]
(https://docs.python.org/ja/3/library/stdtypes.html?highlight=find)を参照することをお勧めします。

ここまでの流れをPythonで書いてみましょう。

# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getDecimalValue(self, head: ListNode) -> int:
        ans = []
        while head:
            ans.append(str(head.val))
            head = head.next
        return int(''.join(ans),2)
# Runtime: 16 ms, faster than 99.88% of Python3 online submissions for Convert Binary Number in a Linked List to Integer.
# Memory Usage: 13.7 MB, less than 85.59% of Python3 online submissions for Convert Binary Number in a Linked List to Integer.

join関数は区切る要素を指定してあげると連結して文字列として返してくれる便利な関数です。

例えば、例で考えてみると、while文が終わった段階で、head = [1,0,1]を配列のansstrで追加しているため、ans = ['1','0','1']となります。ここを連結するためにreturn以降の書き方をしてあげるとans['101',2]となるため、最終的にこれが10進数に変換されて返される、ということになります。

今回はここまで。お疲れ様でした。

コメント

このブログの人気の投稿

Braveブラウザ(iPhone,iPad)にオフラインでもYouTubeの動画が視聴可能なPlaylist機能が追加されていたので使い方をまとめてみた。

自作のChrome Extensionをインポートした時に "Invalid value for 'content_scripts[0].matches[0]': Empty path."というエラーが出たので解決した

Braveブラウザの同期機能をiPhoneで設定した話。