标签:als 第一个 面试 des 因此 运算 如何 count 题目
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。
标签:als 第一个 面试 des 因此 运算 如何 count 题目
原文地址:http://www.cnblogs.com/zzmher/p/7746992.html