前言
来数学题了哇,好熟悉的感觉,让我们来一起找只有素数因子3,5,7的第k个数,其实每个数都是3、5、7幂次方的乘积,那么怎么用代码实现呢?
题目描述
面试题 17.09. 第 k 个数
有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。
示例 1:
输入: k = 5
输出: 9
解题思路
- 既然我们知道第k个数是3、5、7幂次放的乘积,那么我们可以转换一下思维,不算第1个数1,
每一个数都是前一个数与3、5、7的乘积; - 如何确定第k个数是多少,就是要确定前k-1个数中谁与、3、5、7中的一位相乘,
与谁相乘的结果最小我们就取谁; - 获得第k个数的结果后,那么我们
需要知道上一次计算是跟3、跟5还是7乘过的数是第几个数,乘过之后,让记录的第几个数的下标+1,那么下次参与运算的就是所记录下标指向的数值。
开始解题
var getKthMagicNumber = function(k) {
let arr = [];
arr[0] = 1; // 第一个数直接确定就是1
let i3 = 0, i5 = 0, i7 = 0; // 记录与3、5、7相乘的数的下标
while(arr.length < k) {
let minVal = Math.min(arr[i3]*3,arr[i5]*5,arr[i7]*7); // 取与3、5、7相乘的数的最小值作为第k个数
arr.push(minVal);
if(arr[i3]*3 === minVal) i3++; // 如果这个数是与3相乘的,那么我们让代表与3相乘的数前进一位,下次就乘下个数做比较
if(arr[i5]*5 === minVal) i5++;
if(arr[i7]*7 === minVal) i7++;
}
return arr[k-1];
};