オファーが届きました。友達を掘って受け取りましょう!私は2022年の春の採用チェックインイベントに参加しています。クリックしてイベントの詳細を表示します。
序文
昨日の質問は中程度でした。昨日は毎日の質問をする時間がありませんでした。今日はそれを補います。昨日の質問は主に数学的思考の練習に関するものです。問題を解決するには、質問を通じて役立つ情報を見つける必要があります。より良い。
今日の質問
昨日の問題は172でした。階乗、中程度の難易度の後はゼロ
-
整数nを指定すると、n!の結果の後続ゼロの数を返します。
-
ヒントn!= n *(n-1)*(n-2)* ... * 3 * 2 * 1
例1:
输入:n = 3
输出:0
解释:3! = 6 ,不含尾随 0
复制代码
例2:
输入:n = 5
输出:1
解释:5! = 120 ,有一个尾随 0
复制代码
例3:
输入:n = 0
输出:0
复制代码
ヒント:
- 0 <= n <= 104
高度:この問題を解決するために、対数時間計算量のアルゴリズムを設計および実装できますか?
答え
数学的解決策
タイトルは階乗を表すため、階乗は数の上限を簡単に突破する可能性があるため、暴力的な解を使用して計算する方法はありません。そのため、法則を見つける必要があります。
まず、階乗の後に0が表示され、10を掛けた数値の最後に0が表示される理由を見てみましょう。10を掛けることができ、20を掛けることができます。2*10が掛けられていることがわかります。最終的な分析では10まで。
次に、10は2 * 5と見なすことができ、次に5レベルを使用して次のことを示します。5* 4 * 3 * 2*1。これはレベル5なので、彼はいくつのゼロを表示しますか?これらの5つの数値には、5 * 2のペアがあるため、120はゼロです。2*5または4* 5のどちらを使用する場合でも、最終的には次のことができます。 5の数は2の数よりはるかに少ないので、ペアを作るだけです
したがって、ここでの考え方は明確です。層の後ろにいくつかのゼロを要求します。実際、この層では5の倍数を数個要求します。たとえば、25は5 * 5、つまり2つのゼロに分解できます。 、など。現在のレベルを見つける必要があります。5つに分解できる数がいくつかあり、それらのいくつかを個別に分解して、それらを合計して、質問に必要な答えを得ることができます。
次に、125を例として取り上げます。125の階乗では、5、10、15、20などの5の倍数が合計25になり、5 * 5が2つ、つまり25の倍数になります。 25などは2つの5を提供し、125の階乗の合計5は2つの5を提供し、25+5になります。最後に、5 * 5 * 5に等しい125があります。これは3つの5を提供するため、25 + 5 + 1となり、125の階乗の後に310が続くことがわかります。
次に、上記のアイデアをコードに変換します
ループして、現在のnを5で割った値がどれだけ待機するかを決定します。最初の5で割った値は、上記の125の最初の計算に相当します。5を提供できる数値を計算し、2回目に5で割った値です。5は2 5を提供できる数を計算します。類推により、nは5で割ることができないことを常に知っているので、提供できる5の数を計算できます。
/**
* @param {number} n
* @return {number}
*/
var trailingZeroes = function(n) {
let res = 0;
while (n !== 0) {
n = Math.floor(n / 5);
res += n;
}
return res;
};
复制代码