前端算法小白攻略14-leetcode(第 k 个数)

204 阅读2分钟

前言

来数学题了哇,好熟悉的感觉,让我们来一起找只有素数因子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

解题思路

  1. 既然我们知道第k个数是3、5、7幂次放的乘积,那么我们可以转换一下思维,不算第1个数1,每一个数都是前一个数与3、5、7的乘积
  2. 如何确定第k个数是多少,就是要确定前k-1个数中谁与、3、5、7中的一位相乘,与谁相乘的结果最小我们就取谁;
  3. 获得第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];
};