[路飞][LeetCode]面试题17.09. 第 k 个数

559 阅读1分钟

看一百遍美女,美女也不一定是你的。但你刷一百遍算法,知识就是你的了~~

谁能九层台,不用累土起!

题目地址

题目

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

示例:

输入: k = 5

输出: 9

解题思路

  • 我们用数组来记录这些素因子
  • 数的生成规则为3,5,7分别乘上3,5,7的倍数
  • 当时乘上一个类似于15这样既是3又是5的倍数时,会产生重复数15*39*5
  • 因此我们需要排除掉重复的数
  • 我们用三个指针来分别记录3的倍数,5的倍数和7的倍数
  • 将对应的倍数进行比较只记录较小的值,并将指针后移一位,重复k次

解题代码

var getKthMagicNumber = function(k) {
    if(k==1) return k
    let arr = [1]
    let i3 = 0
    let i5 = 0
    let i7 = 0
    for(let i=1;i<k;i++){
        arr[i] = Math.min(arr[i3]*3,arr[i5]*5,arr[i7]*7)
        if(arr[i]==arr[i3]*3) i3++;
        if(arr[i]==arr[i5]*5) i5++;
        if(arr[i]==arr[i7]*7) i7++;
    }
    return arr[k-1]
};

如有任何问题或建议,欢迎留言讨论!