优快云话题挑战赛第2期
参赛话题:学习笔记
题目一、面试题 17.09. 第 k 个数
原题链接:面试题 17.09. 第 k 个数
题目描述:
有些数的素因子只有 3,5,7,请设计一个算法找出第 k个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。
示例 1:
输入: k = 5
输出: 9
解题思路:
要求第K个数,而这些数只有素因子 3,5,7;
我们可以将三个素因子用数组保存起来,轮流将素因子与前K-1个数中的每一个数相乘,就可以得到第 k 个数;
当数与素因子相乘,我们可能会得到重复的数,则就需要使用内容不可重复的Set集合来去重,确定不重复再放入最小堆中存放。
最小堆的堆顶元素就是最小的数,所以只需要让堆顶元素出堆,取出来的第K个数就是前K的数中的第K个。
其实这道题在前面的刷题打卡中已经做过了,不过题目名字叫 ‘丑数’,当作复习一下…
提交代码:
class Solution {
public int getKthMagicNumber(int k) {
int[] arr = new int[]{
3,7,5}; //将素因子存入数组备用
long n = 1l; //1是第一个数,用长整型是因为结果可能超出整形范围
Set<Long> set = new HashSet<>(); //创建Set集合,用于排除重复的数
//创建优先队列,默认为最小堆
PriorityQueue<Long> que = new PriorityQueue<>();
//将一个数分别与三个素因子相乘,若不重复则入最小堆
for(int i = 1;i < k;++i){
for(int a : arr){
//将一个数分别与三个素因子相乘
long q = n*a;//从第一个数1开始与素因子相乘
if(set.add(q)){
//若能放入set集合,说明没重复
que

本文通过实战案例,展示了如何解决三道LeetCode题目:寻找特定素因子构成的第k个数、替换后的最长重复字符及查找字符串中所有异位词。文章提供了详细的解题思路与代码实现。

最低0.47元/天 解锁文章
335





