JavaScript算法題實現-625-最小因式分解——騰訊面試題庫


出題指數(最大5):⭐

題目

給定一個正整數 a,找出最小的正整數 b 使得 b 的所有數位相乘恰好等於 a

如果不存在這樣的結果或者結果不是 32 位有符號整數,返回 0。

樣例 1

輸入:

48 

輸出:

68

樣例 2

輸入:

15

輸出:

35

LeetCode原題目指路

提示:

“不存在這樣的結果”有一種情況是:給定的整數含有大於10的質數因數,不要忘了判斷

題解

我們可以從最低位數字(個位數字)開始枚舉答案,盡量把小的數位上的數字放得越大越好。

所以我們從最低位開始枚舉,並一直放 9 直到 a 不能被 9 整除,即 a 能表示成 a = a0 * 9^t 且 t 盡量大。接下來,我們一直放 8 直到 a0 不能被 8 整除,一直放 7 直到 a0 不能被 7 整除,以此類推。這種貪心方法和深度優先搜索的策略本質上是一樣的,只不過直接找出了最終答案,避免了不必要的搜索。

復雜度分析

時間復雜度:O(log a),將一個數進行因式分解后,它最多可以表示成 O(log a)個數的乘積。

空間復雜度:O(1)。

Javascript實現

/**
 * @param {number} a
 * @return {number}
 */

var smallestFactorization = function (a) {
    result = [];
    // 10以下的直接返回本身
    if (a < 10) {
        return a;
    }
    // 太大舍棄
    else if (a > 2 ** 31) {
        return 0;
    }
    let k = 9;
    while (a > 1 && k > 1) {
        if (a % k === 0) {
            a = a / k;
            result.unshift(k);
            // k = 9; k不需要重置為9,因為每次都是貪心策略,大於當前k的值已經無法被a整除
            continue;
        }
        else {
            k--;
        }
    }
    result = Number(result.join(''));
    // 判斷因式是否有大於10的質數
    if (result > 2 ** 31 || a >= 10) return 0;
    return result;
};
console.log(smallestFactorization(22));
console.log(smallestFactorization(15));

做題心得

最近在面前端的實習工作,js系統學習了一下,然后果斷python轉js。js還是香啊,各路轉換函數一應俱全。

用到的轉換函數:

存儲結果從個位開始依次從數組頭部加進來——unshift()

將數組去掉各元素之間的逗號,轉為字符串——join()

字符串轉為數字——Number()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM