寻找丑数--Java实现

来源:互联网 发布:mac 文件夹无法移动 编辑:程序博客网 时间:2024/06/01 09:47
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 stubFindUglyNums 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;}}