リートコードブラシテストレコード-172.階乗後のゼロ

オファーが届きました。友達を掘って受け取りましょう!私は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まで。

image.png

次に、10は2 * 5と見なすことができ、次に5レベルを使用して次のことを示します。5* 4 * 3 * 2*1。これはレベル5なので、彼はいくつのゼロを表示しますか?これらの5つの数値には、5 * 2のペアがあるため、120はゼロです。2*5または4* 5のどちらを使用する場合でも、最終的には次のことができます。 5の数は2の数よりはるかに少ないので、ペアを作るだけです

image.png

したがって、ここでの考え方は明確です。層の後ろにいくつかのゼロを要求します。実際、この層では5の倍数を数個要求します。たとえば、25は5 * 5、つまり2つのゼロに分解できます。 、など。現在のレベルを見つける必要があります。5つに分解できる数がいくつかあり、それらのいくつかを個別に分解して、それらを合計して、質問に必要な答えを得ることができます。

image.png

次に、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;
};
复制代码

image.png

おすすめ

転載: juejin.im/post/7079314136143757343