剑指 offer代码解析——面试题34丑数
时间:2022-05-03
本文章向大家介绍剑指 offer代码解析——面试题34丑数,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本题详细解析均在代码注释中:
/**
* 题目:我们把只包含因子2、3、5的数称为丑数。求从小到大顺序第1500个丑数。习惯上把1称为第一个丑数。
* @author 大闲人柴毛毛
* @date 2016年3月24日
*/
public class UglyNumber {
/**
* 分析:所谓“只包含因子2、3、5”其实就是只能由2、3、5相乘得到的数称为丑数。
* 根据上述特性,丑数的生产过程如下:
* 从1开始,分别乘以2、乘以3、乘以5,得到三个新的丑数2、3、5;
* 然后再把这三个新的丑数再分别乘以2、乘以3、乘以5,得到9个丑数4、6、10、6、9、15、10、15、25;
* 循环上述操作,就能源源不断地生产丑数。
* 但我们发现,以上生产过程无法保证丑数按照从小到大的顺序生产,而且生产的丑数中有重复丑数。
* 我们只有确保生产的丑数是有序的,才能得到第1500个丑数。因此,在生产的同时,我们需要确保当前生产的丑数都是有序的。
* 过程如下:
* 假设我们已经生产了n个丑数:1……N,接下来我们要生产第n+1个丑数;
* 我们需要从前向后将每个丑数分别乘以2,当找到一个刚刚大于N的丑数时停下;
* 然后再从1开始,从前向后将每个丑数乘以3,寻找刚刚大于N的丑数;
* 同样的方法将每个丑数乘以5,寻找刚刚大于N的丑数。
* 然后选出三个数中最小值,作为第N+1个丑数。
* 以此类推,直到计算出1500个丑数为止。
* 代码如下:
*/
/**
* 计算第n个丑数
* @param n
* @return 返回第n个丑数(返回-1表示程序出错)
*/
public static int uglyNumber(int n){
//若n小于0
if(n<=0){
System.out.println("n小于1!");
return -1;
}
//创建一个长度为n的数组
int[] a = new int[n];
a[0] = 1;
//当前丑数个数
int count = 1;
//循环计算第n个丑数
while(count<n){
int i=0,j=0,z=0;
//从头开始分别乘以2,找到刚刚大于当前最后一个丑数时停下
for(i=0;i<a.length && a[i]*2<=a[count-1];i++);
//从头开始分别乘以3,找到刚刚大于当前最后一个丑数时停下
for(j=0;j<a.length && a[j]*3<=a[count-1];j++);
//从头开始分别乘以5,找到刚刚大于当前最后一个丑数时停下
for(z=0;z<a.length && a[z]*5<=a[count-1];z++);
//找出i、j、z的最小值
int min = a[i]*2;
if(a[j]*3<min)
min = a[j]*3;
if(a[z]*5<min)
min = a[z]*5;
//将最小值作为第n+1个丑数
a[count++] = min;
}
return a[count-1];
}
/**
* 测试
*/
public static void main(String[] args){
System.out.println(uglyNumber(5));
}
}
- 在Windows下安装TensorFlow
- JavaFX——(第一篇:介绍篇)
- 自编码器是什么?有什么用?这里有一份入门指南(附代码)
- UWP基础教程 - {x:DeferLoadStrategy}
- UWP基础教程 - 重启应用
- html5打开摄像头
- UWP基础教程 - App多语言支持
- Golang实现Fibonacii的几种算法
- 【译】使用 dotnet watch 开发 ASP.NET Core 应用
- vmware安装ubuntu12.04嵌套安装xen server(实现嵌套虚拟化)
- Golang语言切片slice的线程协程安全问题
- ASP.NET Core 在 Azure 开启 HTTPS
- 算法基础:最大递减数问题(Golang实现)
- 亲身经历的痛--database/sql: Stmt的使用以及坑
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 创建bean的实例
- Spring-IOC-默认标签的解析
- Spring-IoC -加载 Bean-总览
- Spring-IOC-创建Bean-属性填充
- vi与vim如何修改tab为4个空格方法示例
- Linux使用Crontab定时访问某个路由地址的方法
- jmeter 在linux服务器的安装和运行教程图解
- Linux中改变文件权限的chmod命令详析
- Ubuntu常用指令及用法详解
- Linux 系统使用私钥登录的教程详解
- Ubuntu如何轻松编译openJDK详解
- 详解Linux下Tomcat开启查看GC信息
- Centos7.4 zabbix3.4.7源码安装的方法步骤
- CentOS7环境搭建python3以及与python2实现共存的方法
- centos7.0安装离线JDK1.8方法详解