出題指數(最大5):⭐
題目
給定一個正整數 a
,找出最小的正整數 b
使得 b
的所有數位相乘恰好等於 a
。
如果不存在這樣的結果或者結果不是 32 位有符號整數,返回 0。
樣例 1
輸入:
48
輸出:
68
樣例 2
輸入:
15
輸出:
35
提示:
“不存在這樣的結果”有一種情況是:給定的整數含有大於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()