java---面试题 丑数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。
以上是关于java---面试题 丑数的主要内容,如果未能解决你的问题,请参考以下文章