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

Posted zhoujiayingvana

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()

以上是关于Javascript-625-最小因式分解——腾讯面试题库的主要内容,如果未能解决你的问题,请参考以下文章

奇异值分解SVD和偏最小二乘奇异值分解PLSSVD

QR分解与最小二乘(转载自AndyJee)

腾讯Bugly干货分享彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法

UVa 10791 最小公倍数的最小和(唯一分解定理)

java 625.最小因子分解(第1).java

java 625.最小因子分解(第1).java