每日一题 | 力扣刷题 [面试题 17.09. 第 k 个数]——java

发布于:2022-12-05 ⋅ 阅读:(803) ⋅ 点赞:(0)

CSDN话题挑战赛第2期
参赛话题:学习笔记

题目链接:面试题 17.09. 第 k 个数

题目描述:

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

示例 1:

输入: k = 5

输出: 9

解题思路:

第一个数是1,所以如果输入k为1,直接返回1

创建一个长度为k的整型数组array,存放数据

一个数的素因子只有3,5,7(还包含1和本身),那么这个数必定是3,5,7的整数倍

观察到[1,3,5,7,9,15,21,25,27....]  每个数都是数组已经存在的数乘于3,5,7

定义a,b,c变量,代表数组下标

定义变量min

每次min取数组中存在的数乘于3,5,7的最小值,赋值给array

若min由3相乘得到,则a++;5相乘得到,b++;7相乘得到,c++

最后返回array[k-1]

解题代码:

class Solution {
    public int getKthMagicNumber(int k) {
        // 是1直接返回
        if(k == 1) return 1;
        int[] array = new int[k];
        // 定义4个变量,代表array的下标
        int a = 0 ,b = 0,c = 0,tem = 1;
        array[0] = 1;
        while(tem < k){
            // 素数相乘依旧是素数,每次取最小
            int min = Math.min(Math.min(array[a] * 3,array[b] * 5),array[c] * 7);
            // 确定获得的数,对应下标++
            if(min == array[a] * 3) a++;
            if(min == array[b] * 5) b++;
            if(min == array[c] * 7) c++;
            array[tem++] = min;
        }
        return array[k-1];
    }
}

提交结果: