题解 | #丑数#

丑数

http://www.nowcoder.com/practice/6aa9e04fc3794f68acf8778237ba065b

首先给出暴力法
从1开始判断是否是丑数,若是则count++。
每趟遍历都n++。
当count==index时,返回当前数,即为对应丑数。
这种做法逻辑上是完全没问题的,就是时间复杂度过高。提交运行时会在第11个用例(共13个)处超时,其输入为1500。
这种算法的核心在判断一个数是否是丑数,具体体现为judge函数的实现。每次判断一个数是否能被2,3,5整除,若能,则将该数除以对应的2,3,5后递归调用judge,当输入为1时,返回true,否则返回false。

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        int count = 0;
        int n = 1;
        while(true){
            if(judge(n)){
                count++;
            }
            if(count == index){
                return n;
            }
            n++;
        }
        return -1;
    }
    bool judge(int n){
        if(n == 1){
            return true;
        }
        if(n % 2 == 0){
            return judge(n / 2);
        }
        if(n % 3 == 0){
            return judge(n / 3);
        }
        if(n % 5 == 0){
            return judge(n / 5);
        }
        return false;
    }
};


比起一个数一个数的找,按顺序生成丑数要快得多。
核心思路是按顺序每次生成一个丑数,生成到第index个即为目标数。
观察题目对丑数的定义可以知道,丑数是(2^n1)x(3^n2)x(5^n3),所以可以根据这个通项公式生成丑数。
难点在于如何确定顺序。解决办法是每次生成三个丑数,选出最小的加入数组,并将用于生成该丑数的幂的次数++。
这种生成方式会重复生成一个数,所以当一个数同时可以整除两个或三个数时,就需要将两个或三个幂的次数++。

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if(index < 7){
            return index;
        }
        int i2 = 0;
        int i3 = 0;
        int i5 = 0;
        vector<int> res;
        res.push_back(1);
        for(int i = 1;i < index;i++){
            int n1 = res.at(i2) * 2;
            int n2 = res.at(i3) * 3;
            int n3 = res.at(i5) * 5;
            int min = n1 > n2 ? n2 : n1;
            min = min > n3 ? n3 : min;
            res.push_back(min);
            if(res.at(i) == res.at(i2) * 2){
                i2++;
            }
            if(res.at(i) == res.at(i3) * 3){
                i3++;
            }
            if(res.at(i) == res.at(i5) * 5){
                i5++;
            }
        }
        return res.at(index - 1);
    }
};
全部评论

相关推荐

头像
04-27 15:11
已编辑
华东师范大学 算法工程师
暑期实习从2月开始投,面了两个月,流程该挂的都挂完了,腾讯字节一共号称是1.7w个hc,不知道都发给谁了,估计今年秋招要难顶。Timeline米哈游、美团、蚂蚁、微软等公司直接简历挂穿,没进面。携程:3.3&nbsp;投递、测评3.12&nbsp;笔试3.18&nbsp;一面3.25&nbsp;二面4.13&nbsp;ai面(hr面)4.14&nbsp;英语测评4.23&nbsp;offer(已拒)腾讯:2.6&nbsp;测评2.28&nbsp;wxg一面3.5&nbsp;wxg二面(挂)3.11&nbsp;teg一面3.21&nbsp;teg二面(取消)3.31&nbsp;teg一面4.10&nbsp;teg二面(挂)4.21&nbsp;wxg一面4.24&nbsp;wxg二面(挂)字节:1.28&nbsp;aml约面(取消)3.17&nbsp;火山一面(挂)4.8&nbsp;aml一面(挂)4.20&nbsp;抖音data一面(挂)阿里:3.23&nbsp;投递、测评3.28&nbsp;笔试3.31&nbsp;淘天一面4.8&nbsp;钉钉一面4.9&nbsp;淘天二面4.10&nbsp;阿里控股一面4.12&nbsp;钉钉二面(取消)4.15&nbsp;淘天hr面4.16&nbsp;淘天offer(已接)4.21&nbsp;高德一面(取消)4.22&nbsp;淘宝闪购一面(取消)面试最大的感触是,现在撞上ai转型,一堆老业务急着转向,新业务非常不成熟,研究型的组bar非常高根本进不去,业务侧挂着算法的岗位干的都是工程活,面试却又要问算法,另外agent的落地也远没有那么广,绝大多数还是那套写死的系统调一下llm&nbsp;api或者做做rag,其余少部分真的在搭agent的,基本不能在线上服务用什么很智能的模型,现阶段成本太高,进去大概率就是给垃圾模型从工程方面兜底,除了业务场景的应用和数据经验以外,技术方面很难有什么提升。算法岗做不了基模的还是去搜广推好,之前判断失误了完全没投,秋招不知道还进不进得去。
绿糖滑稽:携程这什么雷霆流程时长
我的求职进度条
点赞 评论 收藏
分享
04-16 10:27
已编辑
美团_Saas_后端开发
今天周一休息,突发奇想写一篇阶段总结。如题,我已经去了一个和Java彻底毫无关联的行业。曾经我以为自己能在计算机行业发光发热,拿到美团offer那会感觉自己天都亮了。没想到刚入行一年多就当了逃兵。从最开始的热爱到现在一看到代码就厌恶,不知道自己经历了什么。所以我去干什么了?答案是:在成都当了租房销售。上班那会压力大了就念叨着去干租房中介,但是一直下不去这个决心,想着自己学了四年多的计算机知识,终究还是不甘心。终于在某一天准备八股文的时候,看着无数篇和工作内容关系不大的理论知识,那一刻下定决心,决定尝试一下销售行业,也算是给自己一个交代。后面阴差阳错的投了成都自如去当租房管家,没想到面试很顺利,在当天一百多个面试的人里面,我成为了为数不多通过的几个幸运儿之一。目前已经培训通过,正式入职,也开了单,有压力但是每天过得很开心,真心喜欢那种和人交流的感觉,哪怕是最后没有选择找我租房。说这些也是想告诉那些大三,大四正在找Java实习而焦虑的同学:你们现在还年轻,选择很多,容错率也很高,可以尽情去尝试自己喜欢的行业和工作。不用因为某一次的面试没通过或者简历石沉大海而焦虑,更不用因为身边人都在挤编程的独木桥就强迫自己跟风。也算是自己的碎碎念吧,也希望自己能在新的领域取得一点小成就。也祝牛油工作顺利!
沉淀小子:干啥都不丢人啊,生存是必须要的,销售很考验一个人综合素质能力的,好的销售人脉和资源可不比写字楼的白领差啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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