码迷,mamicode.com
首页 > 编程语言 > 详细

java---面试题 丑数

时间:2017-10-28 16:35:07      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:als   第一个   面试   des   因此   运算   如何   count   题目   

时间限制: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。

java---面试题 丑数

标签:als   第一个   面试   des   因此   运算   如何   count   题目   

原文地址:http://www.cnblogs.com/zzmher/p/7746992.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!