blog

アルゴリズムの復習:プラス1

最も大きい桁は配列の一番上に格納され,配列の各要素には1桁だけが格納されます.この整数は、整数0を除いて、0から始まることはないと考えてよいでしょう。 問題によると、1を足す必要があります!そうです、...

Oct 25, 2020 · 2 min. read
シェア

トピックの分析

空でない整数の配列で表された負でない整数が与えられたとき、その数に1を足します。

一番大きい桁が配列の一番上に格納され、配列の各要素には 1 桁だけが格納されます。整数 0 以外は、0 から始まることはないと考えてよいでしょう。

例1.

 : [1,2,3]
 : [1,2,4]
 : 123という数を表す配列を入力せよ.

例2.

 : [4,3,2,1]
 : [4,3,2,2]
 : 4321という数を表す配列を入力せよ.


トピックの分析

問題によると、プラス1が必要です!そう、プラス1は重要。なぜなら、プラス1だけで、2つの状況が考慮されるからです:

  • 普通の場合は、9以外の数字に1を足します。

  • 特別なケース,9+1.

そのため、この2つの操作をモデル化するだけで、スムーズに解答を導くことができます!

トピックを図解しています。

想定される数字【1,9,9

おそらく次のようなものでしょう:

もちろん、ここでは特殊なケースを考慮する必要があり、99、または999と同様に、配列をスプライスする必要があります。具体的には、次の図のようになります:

以上の分析を通して、最後はコードに変換するだけです!プラス1 "は見た目ほど単純ではないような気がしませんか?

GO言語の例

以上の分析に基づき、次のような解が得られます:

func plusOne(digits []int) []int {
 var result []int
 addon := 0
 for i := len(digits) - 1;i >= 0; i-- {
 digits[i]+=addon
 addon = 0
 if i == len(digits) - 1 {
 digits[i]++
 }
 if digits[i] == 10 {
 addon = 1
 digits[i] = digits[i] % 10
 }
 }
 if addon == 1 {
 result = make([]int, 1)
 result[0] = 1
 result = append(result,digits...)
 }else{
 result = digits
 }
 return result
}

ヒント

append(a,b...) スライスbの要素をaに加える。

私が書いたすべての解答と各問題の完全な図解をeBookにまとめました。

Read next

デザインパターン学習ノート:メモ・パターン

携帯電話で将棋を指していると、しばしば懺悔機能が提供されます。実際、懺悔とはある履歴状態に戻すことで、多くのソフトウェアではアンドゥと呼ばれています。 アンドゥを実現するには、まず履歴状態を保存する必要があります。アンドゥするときは、ある履歴状態を取り出して、現在の状態を上書きするのです。メモ・モードは、状態復元の実装メカニズムを提供し、新しい状態が無効または...である場合に、ユーザーが特定の履歴ステップに戻ることを容易にします。

Oct 25, 2020 · 6 min read