Java最小因式分解_Javascript-625-最小因式分解——腾讯面试题库

出题指数(最大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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值