《剑指offer》第四十九题(丑数)
// 面试题49:丑数
// 题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到
// 大的顺序的第1500个丑数。例如6、8都是丑数,但14不是,因为它包含因子7。
// 习惯上我们把1当做第一个丑数。 #include <iostream> // ====================算法1的代码====================
//不用额外的内存,直接计算
bool IsUgly(int number)//判断是不是丑数
{
while (number % == )
number /= ;
while (number % == )
number /= ;
while (number % == )
number /= ; return (number == ) ? true : false;
} int GetUglyNumber_Solution1(int index)
{
if (index <= )
return ; int number = ;
int uglyFound = ;
while (uglyFound < index)//从头到尾开始计算
{
++number; if (IsUgly(number))
++uglyFound;
} return number;
} // ====================算法2的代码====================
//使用内存,只计算丑数,节省时间
int Min(int number1, int number2, int number3); int GetUglyNumber_Solution2(int index)
{
if (index <= )
return ; int *pUglyNumbers = new int[index];
pUglyNumbers[] = ;
int nextUglyIndex = ; int *pMultiply2 = pUglyNumbers;//用来存储前面丑数的二倍值中,刚好大于当前最大丑数的数值
int *pMultiply3 = pUglyNumbers;//三倍
int *pMultiply5 = pUglyNumbers;//五倍 while (nextUglyIndex < index)
{
int min = Min(*pMultiply2 * , *pMultiply3 * , *pMultiply5 * );//将这三个值中最小值作为下一个丑数存储
pUglyNumbers[nextUglyIndex] = min; while (*pMultiply2 * <= pUglyNumbers[nextUglyIndex])//更新这三个值
++pMultiply2;
while (*pMultiply3 * <= pUglyNumbers[nextUglyIndex])
++pMultiply3;
while (*pMultiply5 * <= pUglyNumbers[nextUglyIndex])
++pMultiply5; ++nextUglyIndex;
} int ugly = pUglyNumbers[nextUglyIndex - ];
delete[] pUglyNumbers;
return ugly;
} int Min(int number1, int number2, int number3)
{
int min = (number1 < number2) ? number1 : number2;
min = (min < number3) ? min : number3; return min;
} // ====================测试代码====================
void Test(int index, int expected)
{
if (GetUglyNumber_Solution1(index) == expected)
printf("solution1 passed\n");
else
printf("solution1 failed\n"); if (GetUglyNumber_Solution2(index) == expected)
printf("solution2 passed\n");
else
printf("solution2 failed\n");
} int main(int argc, char* argv[])
{
Test(, ); Test(, );
Test(, );
Test(, );
Test(, );
Test(, );
Test(, );
Test(, );
Test(, );
Test(, );
Test(, ); Test(, ); Test(, );
system("pause");
return ;
}
《剑指offer》第四十九题(丑数)的更多相关文章
- 《剑指offer》第十九题(正则表达式匹配)
// 面试题19:正则表达式匹配 // 题目:请实现一个函数用来匹配包含'.'和'*'的正则表达式.模式中的字符'.' // 表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题 ...
- 《剑指offer》第二十九题(顺时针打印矩阵)
// 面试题29:顺时针打印矩阵 // 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. #include <iostream> void PrintMatrixInC ...
- 剑指Offer(二十九):最小的K个数
剑指Offer(二十九):最小的K个数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...
- 剑指Offer(三十三):丑数
剑指Offer(三十三):丑数 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baidu_31 ...
- 《剑指offer》第二十六题(树的子结构)
// 面试题26:树的子结构 // 题目:输入两棵二叉树A和B,判断B是不是A的子结构. #include <iostream> struct BinaryTreeNode { doubl ...
- 《剑指offer》第二十八题(对称的二叉树)
// 面试题28:对称的二叉树 // 题目:请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和 // 它的镜像一样,那么它是对称的. #include <iostream> ...
- 《剑指offer》第二十五题(合并两个排序的链表)
// 面试题25:合并两个排序的链表 // 题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按 // 照递增排序的.例如输入图3.11中的链表1和链表2,则合并之后的升序链表如链 ...
- 《剑指offer》第二十二题(链表中倒数第k个结点)
// 面试题22:链表中倒数第k个结点 // 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯, // 本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点, ...
- 《剑指offer》第十八题(删除链表中重复的结点)
// 面试题18(二):删除链表中重复的结点 // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复 // 结点被删除之后,链表如图3.4(b)所示. #include &l ...
- 《剑指offer》第十八题(在O(1)时间删除链表结点)
// 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点. #include <iostream> ...
随机推荐
- springMVC之一(页面<--->控制器 互相传值,转发和重定向)
#页面--->控制器1.request:不建议使用2.使用属性传值(建议使用)@RequestParam("name") String username3.使用Bean对象传 ...
- ubuntu文件名乱码convmv和iconv
sudo apt install convmv sudo convmv -f gbk -t utf- -r --notest /home/pm/Desktop/p Linux下两个工具convmv和i ...
- UUID实现之一twitter的分布式自增IDsnowflake算法
Twitter的分布式自增ID算法snowflake (Java版) 概述 分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点 ...
- bzoj 1304 [CQOI 2009] 叶子的染色 - 动态规划
题目传送门 快速的传送门 慢速的传送门 题目大意 给定一棵无根树,每个点可以染成黑色或者白色,第$i$叶节点到根的路径上最后有颜色的点必须为$c_{i}$(叶节点可以染色).问最少要染颜色的点的个数. ...
- 使用Http协议Post上传文件
转载:http://www.cnblogs.com/softidea/p/5745369.html 转载:https://blog.csdn.net/huanongying131/article/de ...
- Shell脚本,更改Info.plist中的日期等
#!/bin/bashroot_src=$(dirname $(PWD)) bundle_name='RandomDebbot.bundle' target_path=$root_src/ecovac ...
- Restful framework【第五篇】解析器
基本使用 -解析器 -源码从request.data -全局配置 -'DEFAULT_PARSER_CLASSES':['rest_framework.parsers.JSONParser'], -局 ...
- CentOS7设置定时任务 每隔30分钟执行一次命令
ref https://blog.csdn.net/xiangxianghehe/article/details/78149094 一.安装 crontabs服务并设置开机自启: yum inst ...
- 集合03_Map
Map集合总览 保存映射关系key-value键值对,键唯一,值可以重复,Map和Set的实现类相似 Entry是Map的内部类 Map接口中常用的方法: void clear() Set keySe ...
- C# winform程序防止前台卡死
https://blog.csdn.net/Emiedon/article/details/51069193 在实际开发中,如果需要实时的显示后台处理的情况,我们可能要在前台用一些控件去显示 所以我们 ...