java---面试题 丑数

时间限制:1秒 空间限制:32768K

题目描述

把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
import java.util.ArrayList;
public class Solution {
    public int GetUglyNumber_Solution(int index) {
        /*超时了。。
        int ugly=0;
        int count=1;//1是第一个丑数
        int n=2;
        while(count<index){
            if(ifUgly(n)){
                count++;
            }
            n++;
        }
        return n;
    }
    public boolean ifUgly(int num){
        while(num%2==0)
            num/=2;
        while(num%3==0)
            num/=3;
        while(num%5==0)
            num/=5;
        if(num==1){
            return true;
        }else {
            return false;
        }
    }*/


if(index<=0) return 0; ArrayList<Integer> list=new ArrayList<Integer>(); list.add(1); int m2=0; int m3=0; int m5=0; while(list.size()<index){ int i2=list.get(m2)*2; int i3=list.get(m3)*3; int i5=list.get(m5)*5; int min=Math.min(i2,Math.min(i3,i5)); list.add(min); if(min==i2){ m2++; } if(min==i3){ m3++; } if(min==i5){ m5++; } } return list.get(list.size()-1); } }

第一种感觉也能运行出结果,但是因为每一个数都进行了运算,所以系统检测显示算法超时了,也就是同样的测试用例时间超过了1s,感觉有点奇怪。。没这么夸张吧。。

第二种的话是建立在丑数的定义上的,一个丑数肯定是另一个丑数乘2,3,5的结果,因此,我们可以建立一个数组保存已找见的丑数,然后关键就是如何保证数组内是排序的,这里比较每次乘法m2,m3,m5的大小即可,这么运算下的数组内部肯定是排好序的,这样到最后直接输出即可。

保存已找到的丑数,用空间换时间。这种算法耗时32ms。

posted @ 2017-10-28 15:03  -zzmher  阅读(1425)  评论(0编辑  收藏  举报