剑指OFFER之丑数(九度OJ1214)
时间:2022-04-22
本文章向大家介绍剑指OFFER之丑数(九度OJ1214),主要内容包括题目描述:、解题思路:、全部代码:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
题目描述:
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
输入:
输入包括一个整数N(1<=N<=1500)。
输出:
可能有多组测试数据,对于每组数据, 输出第N个丑数。
样例输入:
3
样例输出:
3
解题思路:
最简单的思路是,从1到大数,每个数都检测一遍是否是丑数,检测方法可以考虑
int ugly(int number){
if(number%2 == 0){
return ugly(number/2);
}else if(number%3 == 0){
return ugly(number/3);
}else if(number%5 == 0){
return ugly(number/5);
}else
return number==1?true:false;
}
可是这种思路,会浪费大量的时间,最后就会超时。
我们考虑一个数组,数组存储的是当前的丑数,以后的每个丑数,都是用之前的数组的元素相乘的来的。接下来就是如何得到后面的丑数并保证它是有序的。
可以想到,数组的第一个元素是1,1与2 3 5分别相乘,可以得到三个值,这三个值里面最小的,肯定就是下一个丑数的最大值,接着max2的下标后移,继续比较。
void mkUglyNumber(){
gArr[top++] = 1;
int *max2 = gArr;
int *max3 = gArr;
int *max5 = gArr;
while(top < 1500){
int min = getMin(*max2*2,*max3*3,*max5*5);
gArr[top] = min;
while(*max2*2 <= gArr[top])
++max2;
while(*max3*3 <= gArr[top])
++max3;
while(*max5*5 <= gArr[top])
++max5;
++top;
}
}
比如,当前的数组元素只是1,那么与2 3 5 相乘得到2 3 5,显然得到的最小值是2。数组元素变为1 2。
下标这回变为2 1 1,继续与2 3 5相乘,得到4 3 5,找出其中最小的,再放进数组,元素变为1 2 3。
继续,直到找到1500个丑数之后,每次进行读取丑数即可。
全部代码:
#include <stdio.h>
#define MAXSIZE 1500
void mkUglyNumber();
int getMin(int max2,int max3,int max5);
int gArr[MAXSIZE];
int top;
int main(){
int n;
top = 0;
mkUglyNumber();
while(scanf("%d",&n)!=EOF && n>=1 && n<=1500){
printf("%dn",gArr[n-1]);
}
return 0;
}
void mkUglyNumber(){
gArr[top++] = 1;
int *max2 = gArr;
int *max3 = gArr;
int *max5 = gArr;
while(top < 1500){
int min = getMin(*max2*2,*max3*3,*max5*5);
gArr[top] = min;
while(*max2*2 <= gArr[top])
++max2;
while(*max3*3 <= gArr[top])
++max3;
while(*max5*5 <= gArr[top])
++max5;
++top;
}
}
int getMin(int max2,int max3,int max5){
int min = max2<max3?max2:max3;
return min<max5?min:max5;
}
/**************************************************************
Problem: 1214
User: xhalo
Language: C
Result: Accepted
Time:10 ms
Memory:920 kb
****************************************************************/
- python获取打开网站的状态码
- 【关关的刷题日记57】Leetcode 101. Symmetric Tree
- FreeBuf官网发布《简易Python Selenium爬虫实现歌曲免费下载》
- HashSet 源码分析
- Angular开发实践(五):深入解析变化监测
- 【关关的刷题日记58】Leetcode 112 Path Sum
- 学大伟业Day解题报告
- Python数据增强(data augmentation)库--Augmentor 使用介绍
- Leetcode-Easy 101. Symmetric Tree
- 数据结构-栈的定义及python实现
- 【关关的刷题日记59】Leetcode 257 Binary Tree Paths
- 学大伟业 国庆Day2
- ECMAScript 6入门 - 变量的解构赋值
- 二叉排序树 python实现
- 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 数组属性和方法
- 一文解决大批量基因相关性分析
- Swift String 与 NSString
- 30.opengl高级光照-HDR
- Angular bootstrap的一个例子
- MicrobiomeAnalyst | 零代码分析宏基因组数据
- Java8实战——通过行为参数化传递代码 顶
- Angular component的一个例子
- 初识mybatis中的缓存
- 【卷积神经网络结构专题】ResNet及其变体的结构梳理、有效性分析
- Steganographer:能帮助在图片中隐藏数据的Python隐写工具
- 内网横向移动:Kerberos认证与(哈希)票据传递攻击
- 诺禾致源linux下数据下载
- 技巧 | OpenCV中如何绘制与填充多边形
- Swift guard
- PyTorch实现TPU版本CNN模型