题目

  • 把只包含质因子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;
    }
}