题目:

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

思路:

1、逐个判断

逐个判断每个整数是不是丑数。根据丑数的定义,丑数只能被2,3,5整除,也就是说,如果一个数能被2整除,连续除以2,如果能被3整除,连续除以3,如果能被5整除,连续除以5,如果最后得到1,那么这个数就是丑数,否则就不是。

2、创建数组保存已经找到的丑数

第一种方法效率比较低,因为该方法对每个数无论是丑事还是非丑数,都进行了计算判断,这在一定程度上是浪费,有没有可能避免这种浪费呢?

根据丑数的定义,后面的丑数应该是前面丑数的2,3,5的倍数结果,因此我们可以创建一个数组,里面的数字是排好序的丑数,每一个丑数都是前面的丑数乘以2,3,5得到。

那么如何保证排序呢?假设当前数组中最大的丑数为M,我们把已有的每个丑数分别乘以2,3,5(实际上并不需要对每个丑数做乘积,只需每次保存上一次的位置即可),分别得到第一个乘以2后大于M的结果M2,第一个乘以3后大于M的结果M3,第一个乘以5后大于M的结果M5,那么下一个丑数就是M2,M3,M5的最小者。

代码:

1、逐个判断

bool isUgly(int n){
while(n%2==0)
n=n/2;
while(n%3==0)
n=n/3;
while(n%4==0)
n=n/5;
if(n==1)
return true;
return false;
} int getUglyNumber(int index){
if(index<=0)
return 0;
int number=1;
int count=0;
while(count<=index){
if(isUgly(number))
count++;
number++;
}
return number;
} class Solution {
public:
int GetUglyNumber_Solution(int index) {
if(index<=0)
return 0;
int count=0;
int number=0;
while(count<index){
++number;
if(isUgly(number))
count++;
}
return number;
} bool isUgly(int n){
while(n%2==0)
n=n/2;
while(n%3==0)
n=n/3;
while(n/5==0)
n=n/5;
return (n==1)?true:false;
}
};

2、只对丑数做操作

int min_3(int num1,int num2,int num3){
num1=(num1<num2)?num1:num2;
num1=(num1<num3)?num1:num3;
return num1;
} int getUglyNumber_1(int index){
if(index<=0)
return 0;
int *uglyNumbers=new int[index];
uglyNumbers[0]=1;
int nextIndex=1; int *index_2=uglyNumbers;
int *index_3=uglyNumbers;
int *index_5=uglyNumbers; while(nextIndex<index){
uglyNumbers[nextIndex]=min_3(*index_2*2,*index_3*3,*index_5*5);
while(*index_2*2<=uglyNumbers[nextIndex]) ++index_2;
while(*index_3*3<=uglyNumbers[nextIndex]) ++index_3;
while(*index_5*5<=uglyNumbers[nextIndex]) ++index_5;
++nextIndex;
} int ugly=uglyNumbers[index-1];
delete[] uglyNumbers;
return ugly;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/6aa9e04fc3794f68acf8778237ba065b?rp=2

AC代码:

class Solution {
public:
int GetUglyNumber_Solution(int index) {
if(index<=0)
return 0;
int uglyNumbers[index];
uglyNumbers[0]=1;
int nextIndex=1;
int index_2=0;
int index_3=0;
int index_5=0; while(nextIndex<index){
uglyNumbers[nextIndex]=min_3(uglyNumbers[index_2]*2,uglyNumbers[index_3]*3,uglyNumbers[index_5]*5);
while(uglyNumbers[index_2]*2<=uglyNumbers[nextIndex]) ++index_2;
while(uglyNumbers[index_3]*3<=uglyNumbers[nextIndex]) ++index_3;
while(uglyNumbers[index_5]*5<=uglyNumbers[nextIndex]) ++index_5;
++nextIndex;
}
return uglyNumbers[index-1];
} int min_3(int num1,int num2,int num3){
num1=(num1<num2)?num1:num2;
num1=(num1<num3)?num1:num3;
return num1;
} };

  

(剑指Offer)面试题34:丑数的更多相关文章

  1. 剑指Offer:面试题34——丑数(java实现)

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

  2. 剑指Offer - 九度1214 - 丑数

    剑指Offer - 九度1214 - 丑数2013-11-21 21:06 题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. ...

  3. 【剑指offer 面试题34】丑数

    只包含因子2.3.5的数称作丑数. #include <iostream> #include <vector> using namespace std; int GetUgly ...

  4. 剑指offer系列59---寻找丑数

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

  5. 【剑指Offer】33、丑数

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

  6. 【剑指offer】q34:丑数

    题目要求第n个丑数.所以对于中间结果不须要保存. def Humble(index): curHum = 1 M2 = 2; M3 = 3; M5 = 5 while index > 1: cu ...

  7. 剑指offer(33)丑数

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

  8. 剑指offer三十三之丑数

    一.题目 如果一个数的因子中,出去1和本身以外,质数因子只包含2.3和5,则把改数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质数因子7. 习惯上我们把1当做是第一个 ...

  9. 剑指Offer——笔试题+知识点总结

    剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...

  10. Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

随机推荐

  1. [转]深入理解Flash Player重绘

    这个是tencent flash team的一篇文章,但团队的博客已经关闭了,所以就在这里备份下吧~ 后来有人把这篇文章又发布到9ria上了,引发了一些讨论,其中有两位大神发言了,内容在原文下方. 9 ...

  2. UVa 11520 Fill the Square 填充正方形

    在一个 n * n 网格中填了一些大写字母,你的任务是把剩下的格子中也填满大写字母,使得任意两个相邻格子(即有公共边的格子)中的字母不同.如果有多重填法,则要求按照从上到下,从左到右的顺序把所有格子连 ...

  3. 【转】 IOS 项目配置--构建输出DIR

    原文网址:http://blog.csdn.net/fengsh998/article/details/8868871 通常在情一般都不建议使用绝对路径,因为写死之后,换环境,换平台,又要重新修改路径 ...

  4. php在apache中一共有三种工作方式:CGI模式、FastCGI模式、Apache 模块DLL

    php在apache中一共有三种工作方式:CGI模式.FastCGI .FastCGI是什么? FastCGI是语言无关的.可伸缩架构的CGI开放扩展,其主要行 为是将CGI解释器进程保持在内存中并因 ...

  5. C++中类的public,private,protected比较

    当private,public,protected单纯的作为一个类中的成员权限设置时:private: 只能由该类中的函数.其友元函数访问,不能被任何其他访问,该类的对象也不能访问. protecte ...

  6. ren

  7. mvc中@RenderSection()研究

    一.@RenderSection定义 HelperResult RenderSection(string name) 但是当如果使用了_Layout.cshtml做母版页的页没有实现Section的话 ...

  8. C字符串和C++中string的区别 &&&&C++中int型与string型互相转换

    在C++中则把字符串封装成了一种数据类型string,可以直接声明变量并进行赋值等字符串操作.以下是C字符串和C++中string的区别:   C字符串 string对象(C++) 所需的头文件名称 ...

  9. ps做gif 登陆下拉菜单效果

    作者这里仅介绍登录动画的制作思路和简单过程.一些细节的制作,如登录框,每一帧的图像等都需要自己根据参考图慢慢完成.最终效果 1.新建大小适当的文件,背景填充暗蓝色.首先设计一个底座,主要用图层样式来完 ...

  10. 使用nodejs中httpProxy代理时候出现404异常

    在公司中使用nodejs构建代理服务器实现前后台分离,代码不能拿出来,然后出现httpProxy代理资源的时候老是出现404.明明被代理的接口是存在的.代码大概如下: var http = requi ...