算法小知识-----9.29----- 第K个数

91 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

快乐周四了,尽管面临着上线,但距离着国庆的到来,已经是无心工作了

第K个数

该题出自力扣的面试题 17.09 第K个数【中等题】

审题

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

  • 示例 1:
  • 输入: k = 5
  • 输出: 9
  • 这道题确实是有点拗口,就是有一堆数,是通过3和5和7的乘积组成起来的,除了第一个数是1外。
  • 给出一个下标K,返回第K个数
  • 通过前面的几个数的推断:1,3,5,7,9,15,21,可以推断出素因子为3,5,7是指必须在A数 乘以3或者乘以5 或者乘以7,取最小值排序在前,并且对应的下标就加一。某一个满足结果的数,一定是之前的某个 resultA3 或者是 resultB5 或者是 resultC*7 的结果
  • 那么首先可以定义一个数组长度就是K
    • 数组的首位下标初始化为1
    • 定义3个变量,分别对应3个素因子,po3、po5、po7,并且初始值为0
    • 循环数组长度,从1开始,因为0已经作为初始值1了
      • 取对应素因子的下标在数组的位置乘以素因子,在3个素因子中取最小值
      • 判断哪个素因子是最小值,对应的下标加一
      • 最终直接返回数组的最后一位即可。

编码

class Solution {
    public int getKthMagicNumber(int k) {
        int[] a = new int[k];
        a[0] = 1;
        int po3 = 0,po5 = 0,po7 = 0;
        for (int i = 1; i < k; i++) {
            int result = Math.min(7 * a[po7],Math.min(3*a[po3],5 * a[po5]));
            if (result % 3 == 0)po3++;
            if (result % 5 == 0)po5++;
            if (result % 7 == 0)po7++;
            a[i] = result;
        }
        return a[k -1];
    }
}

image.png