第 k 个数

250 阅读3分钟

要求

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/ge… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

示例

输入: k = 5

输出: 9

思路

0、List = [1,3,5,7,9,15,21]

1、素因子只有3,5,7,意思就是只能由3,5,7相乘得到的数(包括1)

2、由题目给出的前几个数(List)可以看出

1=3*0
1=5*0
1=7*0

3=3*1

5=5*1

7=7*1

9=3*3

15=3*5

21=3*7

聪明的小伙伴可能已经看出来了(本人当时并没看出来)

第二个数3,是由3 * List的下标为0的数得出来的

第三个数5,是由5 * List的下标为0的数得出来的

第四个数7,是由7 * List的下标为0的数得出来的

至此,3,5,7各用了一次

当到了9的时候,是3 * 3,即素因子3 * List[1]得到的9

当到了15的时候, 是3 * 5,即素因子3 * List[2]得到的15或素因子5 * List[1]

所以我们得到了规律

规律

算出素因子 * List[素因子的使用次数] ,然后再push进List中,就是List的下一个数

注意

有些数(比如15)是由两个素因子(3,5)相乘得到的,所以对应的两个素因子的使用次数都需要+1

图解

1.png

1、初始化,使用次数都为0,对应List的下标0,素因子各乘一次List[自身使用次数],取最小值3,放进List中,素因子3的使用次数+1

2.png

2、现在素因子3使用了一次,所以素因子3所对应的下标为List[1],然后再各乘一次List[自身使用次数],取最小值5,放进List中,素因子5的使用次数+1

3.png

3、同样各乘一次List[自身使用次数],取最小值7,放进List中,素因子7的使用次数+1

4.png

4、接着下一轮,把最小值9放进List中,3的使用次数+1,所对应的List的下标也+1

5.png

代码

/**
 * @param {number} k
 * @return {number}
 */
var getKthMagicNumber = function (k) {
    // 定义三个变量,记录357的使用次数,定义一个数组,长度为k,用来储存从0到k个数的数组
    let p3 = 0,
        p5 = 0,
        p7 = 0,
        list = new Array(k);
    // 数组的第一个数为1
    list[0] = 1;
    // 所以i从1开始,一直到k
    for (let i = 1; i < k; i++) {
        // 取最小值
        list[i] = Math.min(list[p3] * 3, list[p5] * 5, list[p7] * 7);
        if (list[i] === list[p3] * 3) p3++;
        if (list[i] === list[p5] * 5) p5++;
        if (list[i] === list[p7] * 7) p7++;
    }
    return list[k - 1]
};

PC

本人参考博客,如果各位看官觉得我说得不够透彻的话,可以去看看这位老哥写的博客,我是在这位老哥写的博客帮助下搞懂这道题的