【Day15】算法刷题(解题思路+详细注释)[面试题 17.09. 第 k 个数 ][424. 替换后的最长重复字符 ][438. 找到字符串中所有字母异位词 ]

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

优快云话题挑战赛第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
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.29.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值