方法一:暴力法

代码如下:

判断是否是丑数
public static boolean isUgly(int n){
while(n!=1){
if(n%2 == 0){
n /= 2;
}else if(n%3 == 0){
n /= 3;
}else if(n%5 == 0){
n /= 5;
}else{
break;
}
}
return n==1;
}
public static int getUglyNumber(int n){
if(n == 0) return 0;
int count = 0;
for(int i = 1;i<Integer.MAX_VALUE;i++){
if(isUgly(i))
count++;
if(count == n)
return i;
}
return 0;
}

方法二:思路:

三指针法。只计算丑数,而不计算非丑数。丑数=丑数*(2/3/5),所以创建数组保存有序的丑数。
关键在于如何在计算丑数的过程中保持数组有序。当前的丑数必然是之前某一个丑数*因子的结果,
但是不需要每个数都要乘一遍2、3、5。要获得的丑数必然是大于现在已有的,
在计算得出丑数中选择一个最小的放入数组中,来保持数组的有序,因为新放入的丑数是根据之前的丑数计算得到的,
所以必然是有序的。为了每次新得到的三个丑数都是比已有丑数大,且最小,所以要记录各个因子下次计算要使用的已有丑数在什么位置,
否则就会出现跳数,比如已有{1,2,3,4},我们知道下一个丑数应该是5,但是如果因子5没有选择第一个丑数1来相乘,就会漏掉5这个丑数。 代码实现如下:
public static int getUglyNumber(int n) {
if(n == 0) return 0;
//定义三个指针,分别指向质因子2,3,5
int a = 0;
int b = 0;
int c = 0;
int[] arr = new int[n];
arr[0] = 1;
for(int i = 1;i<n;i++){
int r = arr[a]*2;
int s = arr[b]*3;
int t = arr[c]*5;
int sign = Math.min(r,Math.min(s,t));
//将最小的丑数放入结果集中,用于下一次计算
arr[i] = sign;
//找出对应此次计算最小丑数的因子,并移动指针指向下一次计算丑数对应的老丑数下标
if(sign%2==0){
a++;
}
if(sign%3==0){
b++;
}
if(sign%5==0){
c++;
}
}
return arr[n-1];
}

输出第n个丑数的更多相关文章

  1. hdu1058丑数(优先队列、暴力打表)

    hdu1058 题意:当一个数只有2.3.5.7这四种质因数时(也可以一种都没有或只有其中几种),这个数就是丑数,输出第 n 个丑数是多少: 其实并没有发现hdu把这道题放在 dp 专题里的意图,我的 ...

  2. lintcode :Ugly Numbers 丑数

    题目 丑数 设计一个算法,找出只含素因子3,5,7 的第 k 大的数. 符合条件的数如:3,5,7,9,15...... 样例 如果k=4, 返回 9 挑战 要求时间复杂度为O(nlogn)或者O(n ...

  3. 剑指OFFER之丑数(九度OJ1214)

    题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: 输 ...

  4. 九度OJ 1214 寻找丑数【算法】

    题目地址:http://ac.jobdu.com/problem.php?pid=1214 题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因 ...

  5. Humble Numbers(丑数) 超详解!

    给定一个素数集合 S = { p[1],p[2],...,p[k] },大于 1 且素因子都属于 S 的数我们成为丑数(Humble Numbers or Ugly Numbers),记第 n 大的丑 ...

  6. [Jobdu] 题目1214:丑数

    题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: 输 ...

  7. 丑数(Ugly Numbers, UVa 136)

    丑数(Ugly Numbers, UVa 136) 题目描述 我们把只包含因子2.3和5的数称作丑数(Ugly Number).求按从小到大的顺序的第1500个丑数.例如6.8都是丑数,但14不是,因 ...

  8. 剑指Offer - 九度1214 - 丑数

    剑指Offer - 九度1214 - 丑数2013-11-21 21:06 题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. ...

  9. 九度OJ 1214:丑数 (整除)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2180 解决:942 题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因 ...

随机推荐

  1. TF用法指导

    一.变量 1 .tf.Variables() 功能:创建变量 2.tf.get_variable() 功能:创建变量,注意和上面的区别 3.tf.variable_scope() 功能:其实只要记住一 ...

  2. 010-2 Socket套接字类型

    ocket套接字类型 成员名称 说明 Dgram 支持数据报,即为固定 (通常很小) 的最大长度的无连接的. 不可靠的消息. 消息可能会丢失或重复,并且可能不按顺序抵达. 一个 Socket 类型的  ...

  3. MySQL实战45讲学习笔记:索引(第五讲)

    一.需要回表的案例 在下面表T中,执行下面语句,需要执行几次树的搜索操作?会扫描多少行? select * from T where k between 3 and 5 1.初始化语句 mysql&g ...

  4. H5_0006:JS判断PC,平板,手机平台的方法

    <script type="text/javascript"> //平台.设备和操作系统var system = { win: false, mac: false, x ...

  5. 爬虫框架Scrapy 之(二) --- scrapy文件

    框架简介 核心部分: 引擎.下载器.调度器 自定义部分: spider(自己建的爬虫文件).管道(pipelines.py) 目录结构 firstSpider firstSpider spiders ...

  6. logging 简单使用

    import logging logging.basicConfig( level=logging.DEBUG, format='[%(asctime)s <%(filename)s :%(li ...

  7. python3抓图学习-百度贴吧

    # coding=utf-8 from bs4 import BeautifulSoup import urllib.request import os import time def downlao ...

  8. Java中方法定义和调用的学习

    方法其实就是若干语句的功能集合. 参数(原料):就是进入方法的数据.返回值(原产物):就是从方法中出来的数据. 定义方法的完整格式:修饰符  返回值类型  方法名称(参数类型 参数名称,...){ 方 ...

  9. 模拟登陆github

    import requests from lxml import etree class Login(object): def __init__(self): self.headers = { 'Re ...

  10. spring kafka生产、消费消息

    参考网址: https://blog.csdn.net/lansetiankong12/article/details/54946641 1.新建Maven项目-KafkaMaven ->点击n ...