(剑指Offer)面试题34:丑数
题目:
把只包含因子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:丑数的更多相关文章
- 剑指Offer:面试题34——丑数(java实现)
问题描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 思路1: ...
- 剑指Offer - 九度1214 - 丑数
剑指Offer - 九度1214 - 丑数2013-11-21 21:06 题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. ...
- 【剑指offer 面试题34】丑数
只包含因子2.3.5的数称作丑数. #include <iostream> #include <vector> using namespace std; int GetUgly ...
- 剑指offer系列59---寻找丑数
[题目]把只包含因子2.3和5的数称作丑数(Ugly Number). * 例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解法一 ...
- 【剑指Offer】33、丑数
题目描述: 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数 ...
- 【剑指offer】q34:丑数
题目要求第n个丑数.所以对于中间结果不须要保存. def Humble(index): curHum = 1 M2 = 2; M3 = 3; M5 = 5 while index > 1: cu ...
- 剑指offer(33)丑数
题目描述 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 题目分析 ...
- 剑指offer三十三之丑数
一.题目 如果一个数的因子中,出去1和本身以外,质数因子只包含2.3和5,则把改数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质数因子7. 习惯上我们把1当做是第一个 ...
- 剑指Offer——笔试题+知识点总结
剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
- Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)
剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...
随机推荐
- Bootstrap初级用户谈谈网页在手机上的显示效果优化
本人之前已经使用Bootstrap有一段时间了,但是之前做出的网站都只是在电脑端使用,没有注意过手机端的显示效果.这两天自己使用Bootstrap做了一个简单的Web个人日志系统,想在手机端也使用,桌 ...
- js match regex
需要返回成数组元素的要放在括号里头 var arr = /input-([0-9]*)-([0-9]*)/.exec(id); var all = arr[0]; var row = arr[1]; ...
- 嵌入式 使用mp4v2将H264+AAC合成mp4文件
录制程序要添加新功能:录制CMMB电视节目,我们的板卡发送出来的是RTP流(H264视频和AAC音频),录制程序要做的工作是: (1)接收并解析RTP包,分离出H264和AAC数据流: (2)将H26 ...
- MVC和WebApi 使用get和post 传递参数。
我们总结一下用js请求服务器的传参方法. Get方式 Get主要是用来查询,一般分为无参,一个参数,多个参数,实体对象参数. 1.无参 //Get没有参数 var get_f1 = function( ...
- hdu 5444 Elven Postman(根据先序遍历和中序遍历求后序遍历)2015 ACM/ICPC Asia Regional Changchun Online
很坑的一道题,读了半天才读懂题,手忙脚乱的写完(套上模板+修改模板),然后RE到死…… 题意: 题面上告诉了我们这是一棵二叉树,然后告诉了我们它的先序遍历,然后,没了……没了! 反复读题,终于在偶然间 ...
- Android百度地图开发(四)线路搜索
一.标注驾车线路搜索 1.首先需要定义一个起点和一个终点 // 定义一个起始点和终点 private MKPlanNode start; private MKPlanNode end; 2.实例化地图 ...
- scala: How to write a simple HTTP GET request client in Scala (with a timeout)
Scala CookBook: http://scalacookbook.com/ @throws(classOf[java.io.IOException]) @throws(classOf[java ...
- 解读Cardinality Estimation<基数估计>算法(第一部分:基本概念)
基数计数(cardinality counting)是实际应用中一种常见的计算场景,在数据分析.网络监控及数据库优化等领域都有相关需求.精确的基数计数算法由于种种原因,在面对大数据场景时往往力不从心, ...
- AWS Summit 2014 San Francisco站总结
我上个月去San Francisco参加了AWS Summit 2014 会议,总结一下参加这个会议的情况. 什么是AWS Summit? AWS Summit 是AWS在全球各地举办的,针对AWS用 ...
- Having the Result Set of a Stored Proc Sent to You by RSS Feed.
Having the Result Set of a Stored Proc Sent to You by RSS Feed. by JBrooks 14. 十二月 2010 12:44 I wa ...