[路飞]_面试题 17.09. 第 k 个数/264. 丑数 II

153 阅读3分钟

题目路径-面试题 17.09. 第 k 个数
题目路径-264. 丑数 II
B站视频

题目描述

面试题 17.09. 第 k 个数

有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。
示例 1:

输入: k = 5

输出: 9

264. 丑数 II

给你一个整数 n ,请你找出并返回第 n 个 丑数 。

丑数 就是只包含质因数 23 和/或 5 的正整数。
示例 1:

输入: n = 10
输出: 12
解释: [1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。

示例 2:

输入: n = 1
输出: 1
解释: 1 通常被视为丑数。

素因子

质因数(素因数或质因子)在数论里指能整除给定正整数的质数。即没有素因子这种概念。 除了1以外,两个没有其他共同质因子的正整数称为互质。 素数和质数是没有区别的。质数(又称为素数)。质数是指大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。这原本是一个非常简单的概念,但许多数学家却对素数情有独钟,废寝忘食地研究这些素数之间的规律和最大素数。
那研究素数的意义
1、素数与信息安全

素数最主要的应用在密码学-RSA加密,它在网络安全领域中相当重要,利用素数对信息进行加密可以保护国家情报和战时的军事机密,使安全性大大提高。

2、素数与机械工业

素数之间的分布规律也有其它用处,例如机械齿轮的齿数,一大一小两个齿轮之间的设计和素数有很大关系。

大小齿轮的齿数都是素数,可以增加两齿轮内两个相同的齿相遇次数的最小公倍数,说的简单一些就是能使磨损更均匀一些,可以增加耐用度减少机械故障,汽车齿轮的齿数就是按照这个规律设计的,这和人类生活紧密相关。

3、素数与生物

从实践中发现,农药的使用周期以素数次数的使用最为合理。这考虑了害虫体内产生的抗药性、害虫的繁殖周期、喷洒农药后害虫对农作物的损害情况等综合考虑的结果。

解题思路

  • 每个素因子的使用次数,什么为0
  • 什么一个数组,数组[0]为1,因为1默认是第一个素因子
  • 下一个素因子就是2的0次幂,3的0次幂,5的0次幂,这样可以得到2 3 5,然后从小到大排序输出,往后呢,可以是2 3 5 分别乘以2 3 5.

丑数2.jpg

代码

第 k 个数

var getKthMagicNumber = function(n){
    let dp3 = 0, dp5 = 0, dp7 = 0;
    let dp = new Array();
    dp[0] = 1;
    for(let i = 1; i < n; i++){
        dp[i] = Math.min(dp[dp3] * 3, Math.min(dp[dp5]*5, dp[dp7]*7));
        if(dp[i] === dp[dp3] *3) dp3++;
        if(dp[i] === dp[dp5] *5) dp5++;
        if(dp[i] === dp[dp7] *7) dp7++;
    }
    return dp[n - 1];
}

丑数 II

var nthUglyNumber = function(n){
    let dp2 = 0, dp3 = 0, dp5 = 0;
    let dp = new Array();
    dp[0] = 1;
    for(let i = 1; i < n; i++){
        dp[i] = Math.min(dp[dp2] * 2, Math.min(dp[dp3]*3, dp[dp5]*5));
        if(dp[i] === dp[dp2] *2) dp2++;
        if(dp[i] === dp[dp3] *3) dp3++;
        if(dp[i] === dp[dp5] *5) dp5++;
    }
    return dp[n - 1];
}