码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-04-11 20:56:28      阅读:396      评论:0      收藏:0      [点我收藏+]

标签:http   方法   fun   空间复杂度   表示   搜索   leetcode   头部   之间   

出题指数(最大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-最小因式分解——腾讯面试题库

标签:http   方法   fun   空间复杂度   表示   搜索   leetcode   头部   之间   

原文地址:https://www.cnblogs.com/zhoujiayingvana/p/12681761.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!