3 本の指で 0 と 1 と 2 の並びを 1 回で並べ替える

0 と​ 1 と​ 2 だけが​入った​並びを、その場で​小さい​順に​並べ替えて​返します。​3 本の​指で​並びを​ 4 つの​区画に​分け、​1 回なめるだけで​仕分ける​練習です。

海外で定番の問題リスト 4 本のうち 1 本に入っています (Grind 75)

問題

作業の札の並び nums を受け取ります。札には、0 (まだ手を付けていない)、1 (作業中)、2 (済み) の 3 つの値だけが書いてあります。この並びを、0 が全部前、次に 1、最後に 2 となるように、その場で並べ替えて返す関数を書いてください。

  • 新しい並びを作らず、受け取った nums の中身を入れ替えて、その nums を返します
  • 言語に備わった並べ替え (sort) は使いません
  • 並びを前から 1 回なめるだけで、決まった数の置き場だけを使って解いてください
  • nums の長さは 1 以上 300 以下です

入力と出力の例

例 1

入力

nums = [2, 0, 1, 2, 1, 0]

出力

[0, 0, 1, 1, 2, 2]

例 2

2 が 1 つも無いこともあります。

入力

nums = [1, 1, 0]

出力

[0, 1, 1]

例 3

後ろから持ってきた値が 2 のままのこともあります。

入力

nums = [2, 2, 2, 0]

出力

[0, 2, 2, 2]

面接での聞かれ方

面接では、「3 種類の値しか無い並びを並べ替えてください」と短く渡されることが多いです。

  • 最初に sort で済ませると、「備わった並べ替えを使わずにお願いします」と言われます
  • 数を数えて書き直す書き方を出すと、「並びを 1 回だけなめて済ませられますか?」と続きます
  • 書き終えたあとに「後ろと入れ替えたとき、真ん中の指を進めないのはなぜですか?」と、指の動かし方の理由を聞かれます

ここで見られているのは、指ごとに「どこまでが何の区画か」を決めて、それを崩さずに動かせるかです。

アルゴリズムのチートシートの「配列と文字列」に、​この​型の​要点を​表と​コードで​まとめています。

main.py
def sort_colors(nums):
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(sort_colors([2, 0, 1, 2, 1, 0]))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します