29、丑数

题目

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

思路

  • 超时:假如输入为100,意味着在list链表中要写入100个丑数,其实遍历的num个数可能远远大于100,所以会出现超时的情况

代码

  • 牛客超时
import java.util.ArrayList;
public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if(index<0)
            return 0;
        int num=0;
        ArrayList<Integer> list = new ArrayList<>();
        判断链表list中数据个数是否等于index
        while(list.size()<=index){
            num++;
            if(isUgly(num)){
                list.add(num);
            }
        }
        //返回链表最大的那个值index
        return list.get(index);
    }
    
    Boolean isUgly(int num){
        while(num%2==0)
            num=num/2;
        while(num%3==0)
            num/=3;
        while(num%5==0)
            num/=5;
        if(num==1)
            return true;
        else
            return false;
    }
}
  • 可以使用代码
链接:https://www.nowcoder.com/questionTerminal/6aa9e04fc3794f68acf8778237ba065b

所有的丑数分为三种类型 2*i,3*i,5*i     其中 i是数组中的元素,一开始只有1
2*1  3*1  5*1
2*2  3*1  5*1
2*2  3*2  5*1
2*3  3*2  5*1
2*3  3*2  5*2
2*4  3*3  5*2
2*5  3*3  5*2
2*5  3*4  5*2
2*6  3*4  5*3
2*8  3*5  5*3
2*8  3*6  5*4
  • 思路:
import java.util.ArrayList;
public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if(index<=0)
            return 0;
        ArrayList<Integer> list = new ArrayList<>();
        int i1=0,i2=0,i3=0;
        list.add(1);
        int minnum =0;
        while(list.size()<index){
            int m2 = list.get(i1)*2;
            int m3 = list.get(i2)*3;
            int m5 = list.get(i3)*5;
            minnum = Min(m2,Min(m3,m5));
            list.add(minnum);
            if(minnum==m2)
                i1++;
            if(minnum==m3)
                i2++;
            if(minnum==m5)
                i3++;
        }
        return list.get(list.size()-1);
    }
    public int Min(int a,int b){
        return a<b ? a:b;
    }
}
全部评论

相关推荐

HR_丸山彩同学:你的项目描述里,系统设计讲了很多:MemCube是什么、三级存储架构怎么设计、四种遗忘策略分别是什么。这些面试的时候讲没问题,但简历上不需要这么细。 简历要突出的是影响力,不是实现细节。面试官看简历的时候想知道的是「这个项目有多大价值」,不是「这个项目具体怎么实现的」。实现细节是面试时候聊的 怎么改:技术细节可以精简为一句「采用三级存储架构+四种遗忘策略」,把省出来的篇幅用来写影响力。比如:项目有没有开源?有没有写成技术博客?有没有被别人使用过? 校园经历没有任何信息量,任何人都可以写这句话,写了等于没写。更关键的是,你投的是技术岗,校园活动经历本来就不是加分项。如果非要写,必须写出具体的数字和成果。如果你没有这些数字,那就老老实实删掉 「端到端耗时缩减30-40%」要给出确切数字和绝对值。从1000ms降到600ms是降了40%,从100ms降到60ms也是降了40%,但这两个含义完全不一样。其他也是,涉及到数据,准备好证据,口径统一,面试会问 「熟练」「熟悉」「了解」混在一起用,读起来很乱。而且「了解前端需求」最好改成「具备前后端协作经验」
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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