java丑数算法_java---面试题 丑数

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

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 list=new ArrayList();

list.add(1);

int m2=0;

int m3=0;

int m5=0;

while(list.size()

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值