寻找丑数 【微软面试100题 第六十四题】
来源:互联网 发布:程序员接活的网站 编辑:程序博客网 时间:2024/05/16 19:42
题目要求:
我们把只包含因子2、3和5的数称为丑数。例如6、8都是丑数,但是14不是,因为它包含因子7.
习惯上我们把1当作是第一个丑数。
求按从小到大的顺序的第1500个丑数。
参考资料:剑指offer34题。
题目分析:
方法1 从1开始逐个遍历整数,每个整数如果包含2、3和5中的任何一个因子就除以该因子(包含多个就除以多个,直到不含2、3和5这三个因子),如果这样除得的结果为1,则表示只包含2、3和5,为丑数,此时丑数个数加1,直到个数为1500个。
缺点是:效率低,不管一个数是不是丑数都要作计算。
方法2 只计算丑数,后面的丑数根据前面的丑数和2、3、5来得出。计算过程如下图所示:
代码实现:
代码1:
#include <iostream>using namespace std;int GetUglyNumbers(int index);int main(void){ //运行有点慢,需要等一下。可以用GetUglyNumbers(10)来测试。 cout << "第1500个丑数为:" << GetUglyNumbers(1500) << endl; return 0; }bool IsUgly(int number){ while(number%2==0) number /= 2; while(number%3==0) number /= 3; while(number%5==0) number /=5; return (number==1)?true:false;}int GetUglyNumbers(int index){ if(index<=0) return 0; int number = 0; int uglyFound = 0; while(uglyFound < index) { number++; if(IsUgly(number)) ++uglyFound; } return number;}
代码2:
#include <iostream>using namespace std;int GetUglyNumbers(int index);int main(void){ //相比代码1,运行速度快了很多 cout << "第1500个丑数为:" << GetUglyNumbers(1500) << endl; return 0; }int Min(int num1,int num2,int num3){ int min = (num1<num2)?num1:num2; min = (min<num3)?min:num3; return min;}int GetUglyNumbers(int index){ if(index<=0) return 0; int *pUglyNumbers = new int[index]; pUglyNumbers[0] = 1; int nextUglyIndex = 1; int *pUgly2 = pUglyNumbers; int *pUgly3 = pUglyNumbers; int *pUgly5 = pUglyNumbers; while(nextUglyIndex < index) { int min = Min(*pUgly2*2,*pUgly3*3,*pUgly5*5); pUglyNumbers[nextUglyIndex] = min; while(*pUgly2*2 <= pUglyNumbers[nextUglyIndex]) ++pUgly2; while(*pUgly3*3 <= pUglyNumbers[nextUglyIndex]) ++pUgly3; while(*pUgly5*5 <= pUglyNumbers[nextUglyIndex]) ++pUgly5; ++nextUglyIndex; } int ugly = pUglyNumbers[nextUglyIndex-1]; delete[] pUglyNumbers; return ugly;}
0 0
- 寻找丑数 【微软面试100题 第六十四题】
- 微软等数据结构+算法面试100题(28)--丑数
- 微软等数据结构+算法面试100题(28)--丑数
- 程序员面试题精选100题(37)-寻找丑数
- 程序员面试题精选100题(37)-寻找丑数
- 程序员面试题精选100题(37)-寻找丑数
- 算法题38 寻找丑数
- 每日一道算法题-寻找丑数
- 每日一道算法题:寻找丑数
- Ugly Number 寻找丑数 简单题
- google面试题目:寻找丑数
- 把数组排成最小的数 【微软面试100题 第六十八题】
- 【100题】第六十一题~第六十五题(数组中只出现一次的数、链表公共点、删除字串特定字符、寻找丑数、输出从1到最大的N 位数)
- 合并链表 【微软面试100题 第二十四题】
- 实现一个队列 【微软面试100题 第三十四题】
- 诺西的一道笔试题---寻找丑数
- 每天一道算法题19 寻找丑数
- 简单题练习——寻找丑数
- int*&、int&*
- 初始ssh_概念+简单使用
- NSUserDefaults的用法
- poj 3352 Road Construction 边双连通分量
- 代理和协议的简单讲解,和自己的一些见解
- 寻找丑数 【微软面试100题 第六十四题】
- 博客导航
- Eclipse下svn的创建分支/合并/切换使用
- c语言输入输出
- iOS 根据文字长度计算Lable高度
- SpringMVC控制器
- HDU's ACM 1028 Ignatius and the Princess III
- wifi robot的安卓端开发经验教训
- java.lang.ClassNotFoundException: org.apache.log4j.LogManager