题目介绍
有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。
示例1
输入: k = 5
输出: 9
解题思路
根据题目来分析,我们假设这些数都依次存放在一个数组里,那么不在这个数组里面的数,就是素因子包含 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 个数
解题代码
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 个一组翻转链表
[路飞]_旋转链表
[路飞]_两两交换链表中的节点
[路飞]_最近的请求次数