寻找丑数--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实现-丑数2
- 《剑指offer》编程题java实现(七):丑数问题
- Java实现-寻找丢失的数1
- 网易乐得 线下笔试 求第N个丑数 Java实现
- JAVA代码—算法基础:寻找丑数
- 在逆转数组中寻找最小元素——Java实现
- 寻找最长递增数字子串_Java实现
- Java实现寻找链表的中间节点
- Java实现一笔画画板自动寻找路径(一笔画作弊器)
- 剑指Offer面试题34:丑数 Java实现
- Java实现-寻找峰值
- 寻找丑数-算法-java语言
- java实现从迷宫寻找出路算法(广度优先搜索)
- 寻找数组中只出现一次的数 java实现
- 丑数java实现
- 剑指Offer: (Java实现) 丑数
- 寻找和为定值的多个数(Java版实现)
- Java实现——求丑数 方法二
- 寻找最小生成树的kruskal算法的java实现
- 寻找字符串中最长回文——Manacher算法及其Java实现