您的位置:首页 > 编程语言 > Java开发

寻找丑数--Java实现

2013-06-17 22:50 453 查看
import java.util.Iterator;
import java.util.LinkedList;
import java.util.TreeSet;

public class FindUglyNums {

/**
* 问题描述:寻找丑数:把只含有因子2,3,5的数称为丑数,1是第一个丑数,求按从小到大的顺序求第1500个丑数;
* 解决思路:由于只含有因子2,3,5因此可以考虑从1开始分别乘以2,3,5将得到的结果保存,并再次乘以2,3,5依次循环直至第N个丑数出现为止;
* 采用队列作为保存临时结果的数据容器可以保证是以先来后到的顺序进行迭代,同时采用TreeSet保存所有的结果并自动对之排序,最后只需遍历TreeSet取出最后一个结果即可;
* @param args
* @author Adai
* @since 2013/06/17
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
FindUglyNums fun=new FindUglyNums();
TreeSet<Long> rec=fun.findnum(1500l);
Iterator<Long> iter=rec.iterator();
int count=0;
while(iter.hasNext()){
count++;
long now=iter.next();
if(count==1500l){
System.out.println(now);
}
}

}
private TreeSet<Long> findnum(long limit){
LinkedList<Long> dq=new LinkedList<Long>();
TreeSet<Long> res=new TreeSet<Long>();
res.add(1l);
dq.add(1l);
int k=0;
while(k<limit){
long now=dq.pollFirst();
//System.out.println(now);
long two=now*2;
long three=now*3;
long five=now*5;
if(!res.contains(two)){
res.add(two);
dq.addLast(two);
k++;

}
if(k<limit){ //每装填一次检查一下是否达到了Limit的限制
if(!res.contains(three)){//过滤掉重复的结果
res.add(three);
dq.addLast(three);
k++;

}
if(k<limit){//每装填一次检查一下是否达到了Limit的限制
if(!res.contains(five)){
res.add(five);
dq.addLast(five);
k++;

}
}else{
break;
}
}else{
break;
}

}
return res;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java 编程