JZ33 丑数**

题目描述

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

方法1(最笨的方法)

思路

依次判断每一个整数是否为丑数,但是这种方法的时间效率太低,因为需要对每一个整数进行判断(但是这种方法我也没想到)
丑数满足:(1)包含2,3,5的因子 (2)包含2,3,5的因子
(1) 如果能整除2/3/5——number%2==0就代表含有2/3/5的因子
(2) 只含有,如果能整除2,那就除以2;如果能整除3,那就除以3;如果能整除5,那就除以5;直到最后如果为1,则表示是丑数,如果不是,则不是丑数

代码

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if(index==1)
            return 1;
        int count=1;  //第一个丑数为1
        for(int i=2;;i++)
        {
            int number=i;
            while(number%2==0)
                number/=2;
            while(number%3==0)
                number/=3;
            while(number%5==0)
                number/=5;
            if(number==1)
                count++;
            if(count==index)
                return i;
        }
    }
};

方法2(创建一个数组)

思路

列些一些丑数可以发现一个规律,每个丑数都等于前面的丑数乘以2或3或5,所以我们可以创建一个数组,里面的数字是排好序的丑数,之后就可以对数组里的每个丑数乘以2,3,5,取最小值跟在这个数组后面;但是如果每一次都把数组里的所有值乘以2,3,5就会有很多已经在数组里的发生重复,我们可以对于2,3,5分别定义一个类似指针t2,t3,t5;如果数组里的某个数已经乘了2,那t2就往后一个(往后肯定是更大的,因为这是个排好序的数组)
代码如下,有两个注意点:
(1) 数组下标从0开始,但是丑数数数是从1开始的
(2) min函数只能比较两个数

代码

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if(index<7)
            return index;  //穷举法找到规律,1~6个丑数就是1~6
        vector<int> res(index);//初始化一个数组,数组长度为index个(注意下标是从0开始的)
        res[0]=1;
        int t2=0,t3=0,t5=0;
        for(int i=1;i<index;i++)
        {
            res[i]=min(res[t2]*2,min(res[t3]*3,res[t5]*5)); //min函数只能比较两个数
            if(res[i]==res[t2]*2)
                t2++;
            if(res[i]==res[t3]*3)
                t3++;
            if(res[i]==res[t5]*5)
                t5++;
        }
        return res[index-1];  //这里一定要注意

    }
};
全部评论

相关推荐

2025-12-06 01:10
已编辑
哈尔滨工程大学 Java
一面问的真细,二面不知为啥变双机位。9.29快手主站平时怎么学习&nbsp;AI&nbsp;的,国内外知名大模型,实习公司都用的什么大模型,怎么评估效果的java池化思想,线程池构造方法的核心参数,线程池中阻塞队列注意事项,submit方法参数和执行逻辑,shutdown和shutdownnow,核心线程允许过期吗threadlocal底层,为什么key是弱引用,key回收了再get或者set这个value会怎样aqs,如何保证公平性java代理java堆划分,新生代还有别的晋升老年代的情况吗,什么时候触发gc,gc失败抛什么异常,如何排查oom,导出dump命令redis数据结构,哪个底层是跳表,和其他数据结构对比布隆过滤器会出现大key问题吗,你咋实现的布隆过滤器你怎么实现redis分布式锁,可重入,续期聚簇索引非聚簇索引select语句会加锁吗,怎么实现的不加锁undolog&nbsp;redolog&nbsp;binlog怎么能让select加锁,update这个范围加的什么锁,update一条呢手撕简单01背包,接雨水10.10快手主站意图识别用的哪个大模型,走到意图和rag的比例,faq是点击的吗自然语言怎么识别的gap一年干啥了,转正怎么样没跟组里提意向吗,研究生研究方向是传统算法吗,会大模型微调吗注册场景为什么用布隆过滤器,原理分布式锁底层的key怎么拼的,value里是什么redis持久化zset底层mysql索引结构,一个表三个字段有主键唯一索引和没索引的字段会有几个b+树,聚簇索引非聚簇索引存的啥无手撕
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务