下の桁から繰り上がりを運び、桁の並びに 1 を足す

10 進の数を上の桁から並べた桁の並びに 1 を足し、結果も桁の並びで返します。数に直さず、いちばん下の桁から繰り上がりを運び、全部 9 のときだけ頭に 1 を足す練習です。

海外で定番の問題リスト 4 本には入っていません

問題

通し番号を振る仕組みで、番号が 10 進の桁の並び digits で渡されます。並びの先頭がいちばん上の桁です。この番号に 1 を足した番号を、同じく上の桁からの桁の並びで返す関数を書いてください。

  • digits の各値は 0 以上 9 以下です
  • 番号が 0 そのもの ([0]) のときを除き、先頭は 0 ではありません
  • digits の長さは 1 以上 100 以下です。数の型に直すと入りきらない長さもあるので、桁の並びのまま足してください

入力と出力の例

例 1

いちばん下の桁が 9 でなければ、そこに 1 を足すだけです。

digits = [2, 0, 4, 7]
[2, 0, 4, 8]

例 2

下の 2 桁が 9 なので、0 になって上へ繰り上がります。

digits = [3, 9, 9]
[4, 0, 0]

例 3

全部の桁が 9 だと、桁が 1 つ増えます。

digits = [9, 9, 9]
[1, 0, 0, 0]

面接での聞かれ方

面接では、手慣らしの 1 問として出されることが多い問題です。

  • 「配列で表した整数に 1 を足してください」
  • 数に直して足し、並びに戻す書き方を見せると、「100 桁あったらどうしますか?」と聞かれます
  • 「全部 9 のときはどうなりますか?」と、端の場合を聞かれます

筆算の繰り上がりを、そのままコードにできるかが見られています。

ヒント

まだ開いていません

付箋は 3 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3答えに近い

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

配列と文字列の問題は、全部の組を調べると手間が大きくなる所を、窓や左右の添字で減らす形が多いです。

main.py
def plus_one(digits: list[int]) -> list[int]:
    """
    Goal: 何を返すか

    idea1: まず思いつく案
    -> runtime: O(?)  space: O(?)

    idea2: もっと速い案
    -> runtime: O(?)  space: O(?)

    edge case: 空、1 つだけ、など
    """
    # ここに書きます
    pass


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

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