現在、JavaScriptの数値配列を取ります(例:[5, 10, 18, 25, 30]
)。次に必要な最小操作数を含む配列を返します0
から1
を追加するか、または2
を掛けるだけで、ターゲット番号に変更できます。ターゲット番号に到達するために必要な最小操作数をカウントする
例えば、5
の数字は、0 + 1 = 1 x 2 = 2 x 2 = 4 + 1 = 5
となるため、4
を返します。
渡された配列が[5,5,5]
の場合、出力配列は[4,4,4]
になります。
私はこの問題の潜在的な解決法を見てきましたが、そのうちのいくつかは反復と他の再帰を使用していました。私はここに似たような質問の答えを見つけましたCode Review - Find sequence by adding 5 or multiplying by 3。
唯一の違いは、5を追加するか、2を掛けることです。これは0ではなく1から始まります。私のニーズに合わせてこのソリューションを適応しようとしましたが、何らかの理由でコードがいつもadd 1
と決してtimes 2
です。したがって、入力5
の場合、私は0 + 1 = 1 + 1 = 2 + 1 = 3 + 1 = 4 + 1 = 5
と返されますが、明らかに最短の解決策ではありません。
最終的には、入力も配列になるので、配列を返す必要がありますが、パラメータとして単一の整数をとるだけで、上記の答えを適用することにも苦労しています。
この関数に5
を渡すと、のため、4
という最短解ではなく、5
と返されます。
現時点で私が持っているコードは次のとおりです。
function findSequence(goal) {
function find(start, history) {
if (start == goal) {
return history;
}
if (start > goal) {
return null;
}
return find(start + 1, "(" + history + " + 1)") ||
find(start * 2, "(" + history + " * 2)");
}
return find(0, "0");
}
どのように私はこの作業を行うことができますか?私はこれはおそらく、逆に行うことが容易である2
申し訳ありませんが、私のミス、最初の必要性二つのステップを除くすべてのものなので、 ' return goal.toString(2).split( "")。reduce((p、c)=> + p + + c + 1); '。 – ASDFGerte
あなたがリンクした質問から:**この機能は必ずしも最短の操作シーケンスを見つけるとは限りません**あなたが追加して何を増やしているのかを変更すると、なぜそれが最短になると思いますか? – Barmar