3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ゼロから始めるLeetCode Day15 「283. Move Zeroes」

Last updated at Posted at 2020-05-05

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

その対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイト。

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

Leetcode

ゼロから始めるLeetCode 目次

前回
ゼロから始めるLeetCode Day14 「136. Single Number」

基本的にeasyのacceptanceが高い順から解いていこうかと思います。

問題

283. Move Zeroes

難易度はeasy。
今回もTop 100 Liked Questionsからの抜粋です。

問題としては、配列が与えられ、その中の全ての要素を舐めていき、もし値が0だった場合、その0を末尾に挿入します。なお、その際に0以外の値の要素の順序はそのまま保たなければなりません、という問題です。

Example:
Input: [0,1,0,3,12]
Output: [1,3,12,0,0]

解法

二通りの考えが思い浮かんだのでその片方を実装してみました。
片方は0を動かす考え方、そしてもう一方は0以外の数値を動かす、という方法です。
まずは前者を実装してみました。

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        for i in range(1,len(nums)+1):
            if nums[-i] == 0:
                nums.pop(-i)
                nums.append(0)
# Runtime: 52 ms, faster than 54.28% of Python3 online submissions for Move Zeroes.
# Memory Usage: 15 MB, less than 5.97% of Python3 online submissions for Move Zeroes.

popとappendで要素の削除と末尾への挿入を行っています。

対して後者は以下のように実装しました。

class Solution:
    def moveZeroes(self, nums: List[int]) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        h = -1
        for i in range(len(nums)):
            if nums[i] != 0:
                h += 1
                nums[h], nums[i] = nums[i], nums[h]
# Runtime: 52 ms, faster than 54.28% of Python3 online submissions for Move Zeroes.
# Memory Usage: 15 MB, less than 5.97% of Python3 online submissions for Move Zeroes.

まず、hに-1を代入し、iに要素数を代入します。そして仮にnums[i]が0ではない場合、hに1を足し、nums[h]nums[i]nums[h]nums[i]に代入することで入れ替えることがきます。
結果的にこれを全てのように対して行うことで全ての0以外の値が順番を乱すことなく先頭にソートされます。

今回は二つの手順で考えてみました。
もっと良い考え方があれば追記します。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?