[路飞]_第 k 个数

390 阅读2分钟

题目介绍

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

示例1

输入: k = 5

输出: 9

面试题 17.09. 第 k 个数
b站视频

解题思路

根据题目来分析,我们假设这些数都依次存放在一个数组里,那么不在这个数组里面的数,就是素因子包含 3, 5, 7 之外的数

而在这个数组里面的数,可以用 3a * 5b * 7c 来表示,a、b、c 必须是在此数组中的数或 0 或 1(a、b、c 不同时为 0,1 不包含任何素因子)

因此使用 3、5、7 分别与数组中的数相乘的结果必定也是素因子只有 3,5,7的数,所以本题的解题思路就是使用 3、5、7 依次与数组中的值相乘,并将结果存放到数组中

1.定义一个数组,数组中存放元素 1
2.定义 p3, p5, p7 分别指向数组的第一个位置
3.分别计算 3 * p3指向的位置的值5 * p5指向的位置的值7 * p7指向的位置的值,然后比较这3个值的大小
4.将最小的值存放到数组的下一位
5.将计算结果与最小值相等的指针移动到当前位置的下一位
6.重复 3-5 的过程,直到获取到第 k 个数

1.gif

解题代码

var getKthMagicNumber = function(k) {
    let p3 = 0, p5 = 0, p7 = 0
    const arr = [1]
    while (--k) {
        const val_3 = arr[p3] * 3, val_5 = arr[p5] * 5, val_7 = arr[p7] * 7
        const val = Math.min(val_3, Math.min(val_5, val_7))
        arr.push(val)
        val_3 === val && p3++
        val_5 === val && p5++
        val_7 === val && p7++
    }
    return arr[arr.length - 1]
};

以上就是本题的解题思路,欢迎查看我的其他文章
[路飞]_环形链表
[路飞]_环形链表II
[路飞]_快乐数
[路飞]_反转链表
[路飞]_反转链表II
[路飞]_K 个一组翻转链表
[路飞]_旋转链表
[路飞]_两两交换链表中的节点
[路飞]_最近的请求次数