18-leetCode: 面试题 17.09. 第 k 个数

155 阅读1分钟

题目

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

示例

输入: k = 5

输出: 9

解题思路

维护三个指针p3, p5, p7,三个指针都是数组arr的下标,取指针对应值与对应的3、5、7分别相乘,三个值取最小值放进数组,当然,里面会有重复的数,所以, 需要判断当前值与对应指针与对应数值的值是否相等,相等则让对应指针+1,最后得到的就是需要的数因子数组。返回arr[k -1]即可

/**
 * @param {number} k
 * @return {number}
 */
var getKthMagicNumber = function(k) {
    const arr = new Array(k);
    // 维护这三个数组下标
    let p3 = 0, p5 = 0, p7 = 0;
    // 特殊处理1这个数
    arr[0] = 1;
    for(let i = 1; i < k; i++) {
        // 取对应下标与对应素因子的积的最小值放进数组
        arr[i] = Math.min(arr[p3]*3, arr[p5]*5, arr[p7]*7);

        // 每次有相同数出现时,去重处理,对应下标+1
        if(arr[i] === arr[p3]*3) p3++;
        if(arr[i] === arr[p5]*5) p5++;
        if(arr[i] === arr[p7]*7) p7++;
    }

    return arr[k - 1];
};