てくてくテック

【LeetCode】344. Reverse String 25日目

leetcode

どーも!

たかぽんです!

今回もやっていこうと思います!

344. Reverse String

本日の問題は以下。

やることとしては、単純に配列の要素として文字をもつリストが渡されるので、その値を逆順にしたリストを返せ...といったものです。

いつも通り、例をお借りすると...

Input: ["h","e","l","l","o"]
Output: ["o","l","l","e","h"]

上記のように、Inputでhelloという文字が要素として保持されていて、それをひっくり返したOutputを出せ。

といった問題ですね。

ただし...

一つだけ大切な条件があります。

Do not allocate extra space for another array, 
you must do this by modifying the input array in-place with O(1) extra memory.

つまり、別の配列を作ってなんかしたりしちゃだめですよ〜!と。

与えられたinputの配列そのものを編集して、Outputの形にする必要があります。

筆者の得意分野が潰されました...w

というわけで、問題はなんとなくわかったかと思います。それでは、アルゴリズムを検討していきましょう。

アルゴリズム

筆者が思いついた方法だと、まず最初に配列の要素数分ループを回すのですが、その際に末尾から順番に値を取得していきます。

そして、順番に取得する値をそれぞれ都度末尾に追加していきます。

そうすることで...

['h', 'e', 'l', 'l', 'o']  // オリジナル
['h', 'e', 'l', 'l', 'o']  // oを取り出して末尾につける
['h', 'e', 'l', 'o', 'l']  // 後ろのlを取り出して末尾につける
['h', 'e', 'o', 'l', 'l']  // 手前のlを取り出して末尾につける
['h', 'o', 'l', 'l', 'e']  // eを取り出して末尾につける
['o', 'l', 'l', 'e', 'h']  // 完成!

のようになるイメージです。

初回に関しては末尾を取得して、末尾に追加するという不毛なことをやってしまっていますが、いったん目を瞑ります...w

手元で取ったメモだとこんな感じです。

都度sのオリジナルのリストを書き換えていくのですが、ちゃんとデクリメントさせることによって、後ろに追加し多分が逆順に整列されているイメージですね。

気をつけないといけないのが、s自体を編集しているため、下手にpopしてしまうと、編集後のpopになります。

そのため、初期のhelloのpop(2)はeですが、例えば上記の4段階目にあるsのappend後"holle"の場合は、sの中身がholle"なので、pop(2)はoになります。

そこに気をつけて処理をかければうまくできるかと思います。

提出したコード

最後に提出したコードを以下に載せておきます。

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        for i, char in enumerate(s):
            popped = s.pop(len(s) -1 - i)
            s.append(popped)
        return s

# 結果
Runtime: 424 ms, faster than 5.16% of Python3 online submissions for Reverse String.
Memory Usage: 18.5 MB, less than 81.19% of Python3 online submissions for Reverse String.

モバイルバージョンを終了