持续创作,加速成长!这是我参与「掘金日新计划 · 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];
}
}