题目描述

  我们把只包含因子2、3和5的数称作丑数( Ugly Number)。求按从小到大的顺序的第1500个丑数。例如,6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当作第一个丑数。

牛客网刷题地址

思路分析

  1. 直接求,判断每一个数是否为丑数,时间效率低下
  2. 创建数组存放已经排序好的丑数,这将消耗一定的内存开销。根据丑数的定义,丑数应该是另一个丑数的2、3或者5倍的结果,因此,我们从数组中已有的丑数里找到三个丑数T2、T3、T5,它们分别和2、3、5相乘得到的值恰好比已有的最大丑数大,三个乘积中最小的一个就是下一个丑数,存放入数组中,同时更新T2、T3、T5,使它们仍然保持与2、3、5的乘积恰好比已有的最大丑数大。

测试用例

  1. 功能测试:输入2、3、4、5、6等。
  2. 特殊输入测试:边界值1;无效输入0。
  3. 性能测试:输入较大的数字,如1500。

Java代码

public class Offer049 {
public static void main(String[] args) {
test1();
test2();
test3(); } public static int GetUglyNumber(int index) {
return Solution2(index);
} /**
* 挨个判断是否是丑数,直到找到index个丑数为止
* 时间效率低下
* @param index
* @return
*/
private static int Solution1(int index) {
if(index<=0) {
return 0;
}
int number = 0;
int uglyCount = 0;
while(uglyCount<index) {
++number;
if(isUglyNumber(number)) {
++uglyCount;
}
}
return number;
} private static int Solution2(int index) {
if(index<=0) {
return 0;
}
int[] uglyNumbers = new int[index];
uglyNumbers[0]=1;
int index2=0;
int index3=0;
int index5=0;
for(int i=1;i<index;i++) {
uglyNumbers[i] = getMin(uglyNumbers[index2]*2 ,uglyNumbers[index3]*3,uglyNumbers[index5]*5);
while(uglyNumbers[index2]*2<=uglyNumbers[i]) {
index2++;
}
while(uglyNumbers[index3]*3<=uglyNumbers[i]) {
index3++;
}
while(uglyNumbers[index5]*5<=uglyNumbers[i]) {
index5++;
}
} return uglyNumbers[index-1];
} private static int getMin(int i, int j, int k) {
int min = (i<j) ? i:j;
min = (min<k)? min:k;
return min;
} private static boolean isUglyNumber(int number) {
while(number%2==0) {
number/=2;
}
while(number%3==0) {
number/=3;
}
while(number%5==0) {
number/=5;
}
return number==1;
} private static void test1() {
System.out.println(GetUglyNumber(6));
System.out.println(GetUglyNumber(1500));
} private static void test2() {
System.out.println(GetUglyNumber(0));
}
private static void test3() { } }

代码链接

剑指Offer代码-Java

【Offer】[49] 【丑数】的更多相关文章

  1. 剑指 Offer 49. 丑数 + 小根堆 + 动态规划

    剑指 Offer 49. 丑数 Offer_49 题目详情 解法一:小根堆+哈希表/HashSet 根据丑数的定义,如果a是丑数,那么a2, a3以及a*5都是丑数 可以使用小根堆存储按照从小到大排序 ...

  2. 力扣 - 剑指 Offer 49. 丑数

    题目 剑指 Offer 49. 丑数 思路1 丑数是只包含 2.3.5 这三个质因子的数字,同时 1 也是丑数.要计算出 n 之前全部的丑数,就必须将 n 之前的每个丑数都乘以 2.3.5,选取出最小 ...

  3. 【Java】 剑指offer(49) 丑数

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 我们把只包含因子2.3和5的数称作丑数(Ugly Number). ...

  4. 每日一题 - 剑指 Offer 49. 丑数

    题目信息 时间: 2019-07-03 题目链接:Leetcode tag:动态规划 小根堆 难易程度:中等 题目描述: 我们把只包含质因子 2.3 和 5 的数称作丑数(Ugly Number).求 ...

  5. [剑指offer] 49. 丑数

    通俗易懂的解释: 首先从丑数的定义我们知道,一个丑数的因子只有2,3,5,那么丑数p = 2 ^ x * 3 ^ y * 5 ^ z,换句话说一个丑数一定由另一个丑数乘以2或者乘以3或者乘以5得到,那 ...

  6. 剑指 Offer 49. 丑数

    题目描述 我们把只包含质因子 2.3 和 5 的数称作丑数(Ugly Number).求按从小到大的顺序的第 n 个丑数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, ...

  7. 【剑指offer】面试题 49. 丑数

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

  8. 【剑指Offer】丑数 解题报告

    [剑指Offer]丑数 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目描述: ...

  9. 《剑指offer》面试题49. 丑数

    问题描述 我们把只包含因子 2.3 和 5 的数称作丑数(Ugly Number).求按从小到大的顺序的第 n 个丑数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5 ...

  10. 【剑指offer】丑数

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

随机推荐

  1. hive数仓客户端界面工具

    1.Hive的官网上介绍了三个可以在Windows中通过JDBC连接HiveServer2的图形界面工具,包括:SQuirrel SQL Client.Oracle SQL Developer以及Db ...

  2. cdh5-MariaDB 配置(暂未排版)

    在多数分布MariaDB的设施默认设置使用保守的缓冲区的大小和内存使用. 使用保守的缓冲区大小和内存使用率 Cloudera的数据库管理服务器,监控活动,报告管理,Cloudera 导航,Hive 的 ...

  3. java多线程基础(二)--java线程各状态关系

    注意只有可运行(就绪态)和运行中(运行态)可以相互转换

  4. Java虚拟机——Java内存区域

    1.运行时区域 Java虚拟机在执行Java程序的时候会把它管理的内厝划分为若干个不同功能的数据区域,如图所示 首先是程序计数器,程序计数器可以理解为当前程序执行的字节码的行号指示器,计数器中的数据即 ...

  5. springboot整合websocket高级版

    目录 sockjs介绍 产生的原因 环境搭建 springboot整合sockjs 使用场景 聊天室开发 点对点通信 群聊 效果 总结 加入战队 微信公众号 上一章节我们说了websocket的优缺点 ...

  6. soap天气查询

    public class MainActivity extends AppCompatActivity { private TextView tvContent; @Override protecte ...

  7. Flutter 1.7 正式版发布

    今天,我们非常高兴地向大家宣布又一个正式版本的发布 -- Flutter 1.7,这是继上次 I/O 时众多重要功能发布以来的一次小更新.Flutter 1.7 包含了对 AndroidX 的支持,满 ...

  8. HTTP请求包和响应包

    HTTP请求包 HTTP响应包

  9. python3.6.6在CentOS7上的安装

    Python官网:https://www.python.org/ 下载指定版本的软件包: [root@General data]# yum clean all  &&  yum rep ...

  10. git 技术栈

    之前用的都是svn ,git还是要了解的,万一哪天要用了呢