标签:http 方法 fun 空间复杂度 表示 搜索 leetcode 头部 之间
出题指数(最大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)。
/**
* @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()
标签:http 方法 fun 空间复杂度 表示 搜索 leetcode 头部 之间
原文地址:https://www.cnblogs.com/zhoujiayingvana/p/12681761.html