LeetCode刷题,面试题 17.09. 第 k 个数

1,012 阅读2分钟

第K个数

有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。不是必须有这些素因子,而是必须不包含其他的素因子

解题代码

思路:

  1. 使用数组,进行添加素因子操作,定义三个指针,每个指针代表当前指向数组中数字每次该3或5或*7
  2. 这样一轮就获得了包含 3 5 7 素因子的3个数字,选出其中最小值,添加入数组。
  3. 每次指针乘完以后判断是哪个指针乘得的值和添加入队列的值相同,那么这个指针位置要向后移动一位
  4. k轮操作之后,就选出了第k个数返回即可。
var getKthMagicNumber = function(k) {
  let queue = new Array();
  queue.push(1); // 先往队列添加一个1(1也是素因子),并用于基准值进行计算
  let p3 = 0; // 三个指针都初始化都指向队列头。然后每次用当前指针指向位置的数字依次进行 * 3 * 5 * 7 ,出现3个待选数字
  let p5 = 0;
  let p7 = 0;
  while (queue.length < k) {
    let p3Res = 3 * queue[p3];
    let p5Res = 5 * queue[p5];
    let p7Res = 7 * queue[p7];
    let min = Math.min(p3Res,p5Res,p7Res); // 选出待选值中最小的一个

    // 这里包含一个特殊情况,就是可能会有多个指针的值相同且在三个待选数字中最小,那么直接两个指针一起从它当前位置往后走一步
    if (p3Res === min) p3++ ; // 最小值与指针下的数字进行对比,如果当前指针乘上的值等于min,那么当前指针往后走一位
    if (p5Res === min) p5++ ; 
    if (p7Res === min) p7++ ;
    queue.push(min); // 最小值入队。此时队列中就多了一个比前一位大且比后一位小的素因子。 
  }
  return queue[k-1]; // 返回第k个素因子即可。
};