下の 桁から 繰り 上がりを 運び、 桁の 並びに 1 を足す
10 進の
海外で定番の問題リスト 4 本には入っていません
問題
通し番号をdigits で
digitsの各値は 0 以上 9 以下です - 番号が 0
その もの ( [0]) のときを 除き、 先頭は 0 では ありません digitsの長さは 1 以上 100 以下です。 数の 型に 直すと 入りきらない 長さも あるので、 桁の 並びのまま 足してください
入力と出力の例
例 1
いちばん下の
例 2
下の 2 桁が 9 なので、
例 3
全部の
面接での聞かれ方
面接では、
- 「配列で
表した 整数に 1 を 足してください」 - 数に
直して 足し、 並びに 戻す 書き方を 見せると、 「100 桁あったら どうしますか?」と 聞かれます - 「全部 9 の
ときは どうなりますか?」と、 端の 場合を 聞かれます
筆算の
ヒント
まだ開いていません
付箋は 3 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3答えに近い
アルゴリズムのチートシートの「配列と文字列」に、
関わる学び
配列と
まず 考える手順
段 1
数に
段 2
いちばん下の
段 3
全部の
解答
Python
Python
def plus_one(digits):
out = list(digits)
for i in range(
len(out) - 1, -1, -1
):
if out[i] < 9:
out[i] += 1
return out
out[i] = 0
return [1] + outJavaScript
JavaScript
function plusOne(digits) {
const out = [...digits];
for (
let i = out.length - 1;
i >= 0;
i--
) {
if (out[i] < 9) {
out[i] += 1;
return out;
}
out[i] = 0;
}
return [1, ...out];
}Go
Go
func plusOne(digits []int) []int {
out := make([]int, len(digits))
copy(out, digits)
for i := len(out) - 1; i >= 0; i-- {
if out[i] < 9 {
out[i]++
return out
}
out[i] = 0
}
return append([]int{1}, out...)
}どのdigits は
計算量
- 時間は、
桁の 数を n として O(n) です。 いちばん悪いのは 全部が 9 の ときで、 全部の 桁を 1 回ずつ見ます - 使う
記憶は、 答えの 並びの 分の O(n) です - 下の
桁が 9 でなければ 1 桁見ただけで 終わるので、 ふつうは すぐに返ります
よく ある間違い
- 数に
直して足す。 例 3 のような 短い 並びでは 動きますが、 20 桁を 超えると 64 ビットの 整数に 入りきらず、 JavaScript の 数では 下の 桁が狂います - 繰り
上がりの 後に 止め忘れる。 9 でない 桁に 1 を 足したら、 すぐに 返します。 続けて 上の 桁も 見ると、 ほかの 桁まで 書き換えてしまいます - 全部 9 の
場合を忘れる。 例 3 で、 最後まで 繰り 上がったのに [0, 0, 0]を返してしまいます。 頭に 1 を足します - 上の
桁から 足し始める。 繰り 上がりは 下から 上へ 運ぶので、 並びの 末尾から見ます
解答を動かした版 Python 3.14.7Node.js 24.22.1Go 1.24.2確認日 2026年11月8日
面接での 話し方の例
書き始める
「桁が
多いと 数の 型に 入らないので、 並びのまま 筆算します。 末尾から 見て、 9 でなければ 1 を 足して 返し、 9 なら 0 に して 上へ 繰り上げます。 最後まで 繰り 上がったら、 頭に 1 を 足した 1 つ長い 並びを 返します。 時間も 記憶も O(n) です。」
書き終えたら、
「例 2 の
[3, 9, 9]をたどります。 末尾の 9 は 0 に して 繰り上げ、 次の 9 も 0 に して 繰り上げます。 3 は 9 でないので 4 に して、 [4, 0, 0]を返します。」