【面试题034】丑数

【面试题034】丑数

题目:

我们把只包含因子2、3和5的数称为丑数(Ugly
Number)。

求按从小到大的顺序的第1500个丑数。

例如6、8都是丑数,但14不是,因为他包含因子7。习惯上我们把1当做第一个丑数。

思路一:

逐个的判断,效率不高。






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47

 

#include <iostream>

using namespace std;

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 GetUglyNumber(int index)
{
    if (index <= 0)
    {
        return 0;
    }
    int number = 0;
    int uglyFound = 0;
    while (uglyFound < index)
    {
//number一直在累加,while判断的是uglyFound
        ++number;
        if (IsUgly(number))
        {
            ++uglyFound;
        }
    }
    return number;
}

int main()
{
    cout << GetUglyNumber(15) << endl;
    return 0;
}

思路二:

创建数组保存已经找到的丑数,用空间换时间的解法。

尝试找一种只计算丑数的方法,而不是在非丑数的整数上花时间,

——根据定义丑数应该是另一个丑数乘以2、3或者5的结果,当然初始化的时候只有1,

1*2 1*3 1*5

2*2 3*2 5*2

2*3 3*3 5*3

2*5 3*5 5*5……

都分别乘以2、3、5事实上这不是必须的,请看以下代码中

——三个int指针的应用:






1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55

 

#include <iostream>

using namespace std;

int Min(int number1, int number2, int number3)
{
    int min = (number1 < number2) ? number1 : number2;
    min = (min < number3) ? min : number3;
    return min;
}

int GetUglyNumber(int index)
{
    if (index <= 0)
    {
        return 0;
    }
    int *pUglyNumbers = new int[index];
    pUglyNumbers[0] = 1;
    int nextUglyIndex = 1;

    int *pMultiply2 = pUglyNumbers;
    int *pMultiply3 = pUglyNumbers;
    int *pMultiply5 = pUglyNumbers;

    while (nextUglyIndex < index)
    {
        int min = Min(*pMultiply2 * 2, *pMultiply3 * 3, *pMultiply5 * 5);
        pUglyNumbers[nextUglyIndex] = min;

        while (*pMultiply2 * 2 <= pUglyNumbers[nextUglyIndex])
        {
            ++pMultiply2;
        }
        while (*pMultiply3 * 3 <= pUglyNumbers[nextUglyIndex])
        {
            ++pMultiply3;
        }
        while (*pMultiply5 * 5 <= pUglyNumbers[nextUglyIndex])
        {
            ++pMultiply5;
        }
        ++nextUglyIndex;
    }
    int ugly = pUglyNumbers[nextUglyIndex - 1];
    delete[] pUglyNumbers;
    return ugly;
}

int main()
{
    cout << GetUglyNumber(15) << endl;
    return 0;
}

【面试题034】丑数

时间: 2024-08-29 18:18:06

【面试题034】丑数的相关文章

【剑指offer】面试题 49. 丑数

面试题 49. 丑数 题目描述 题目:把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解答过程 样例 给出 num = 8,返回 true. 给出 num = 14,返回 false. 代码实现 1.判断一个数是否是丑数 public class Solution { /** * @param num: An integer * @return: true if n

46. 谷歌面试题:寻找丑数

题目:我们把仅仅包括因子2.3和5的数称作丑数(Ugly Number).比如6.8都是丑数,但14不是,由于它包括因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第1500个丑数. 分析:这是一道在网络上广为流传的面试题,据说google以前採用过这道题. 这段题刚開始的想法是从1開始递增遍历,找出1500个是丑数的数,并打印出来. 实现例如以下: #include<stdio.h> #include<string.h> #include<iostream&g

剑指Offer面试题34(java版):丑数

题目:丑数 * 我们把只包含因子2,3,5的数称为丑数(Ugly Number). * 求按从小到大的顺序的第1500个丑数. * 例如6,8都是丑数,但14不是,因为它含有因子7.习惯上我们把1当作第一个丑数 方法一:逐个判断每个整数是不是丑数的解法,直观但不够高效: 所谓一个数m是另一个数n的因子,是指n能被m整除,也就是说n%m==0.根据丑数的定义,丑数只能被2,3,5整除.也就是说如果一个数能被2整除,我们把它连续除以2:如果能被3整除,就连续除以3:如果能被5整除,就除以5.如果最后

37.寻找丑数

http://zhedahht.blog.163.com/blog/static/2541117420094245366965/ http://www.cppblog.com/zenliang/articles/131094.html http://www.cnblogs.com/coser/archive/2011/03/07/1976525.html 题目:我们把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做是

《剑指offer》第四十九题(丑数)

// 面试题49:丑数 // 题目:我们把只包含因子2.3和5的数称作丑数(Ugly Number).求按从小到 // 大的顺序的第1500个丑数.例如6.8都是丑数,但14不是,因为它包含因子7. // 习惯上我们把1当做第一个丑数. #include <iostream> // ====================算法1的代码==================== //不用额外的内存,直接计算 bool IsUgly(int number)//判断是不是丑数 { while (num

剑指Offer对答如流系列 - 丑数

面试题49:丑数 题目描述 我们把只包含质因子2.3和5的数称作丑数(Ugly Number).求按从小到大的顺序的第N个丑数. 例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数. 问题分析 判断一个数是不是丑数,最容易想到的方法就是让这个数不断除以2,3,5. 对于第N个丑数,只要从1开始,依次判断每个数是不是丑数,如果是,则相应的序号加1,直到序号为N,就是我们要的丑数了.但是这种方法时间效率很,通常面试官不会满意这样的答案.因此我们需要一个时间复杂度更低

Humble Numbers(丑数) 超详解!

给定一个素数集合 S = { p[1],p[2],...,p[k] },大于 1 且素因子都属于 S 的数我们成为丑数(Humble Numbers or Ugly Numbers),记第 n 大的丑数为 h[n]. 算法 1: 一种最容易想到的方法当然就是从 2 开始一个一个的判断一个数是否为丑数.这种方法的复杂度约为 O( k * h[n]),铁定超时(如果你这样做而没有超时,请跟 tenshi 联系) 算法 2: 看来只有一个一个地主动生成丑数了 : 我最早做这题的时候,用的是一种比较烂的

洛谷P2723 丑数 Humble Numbers [2017年 6月计划 数论07]

P2723 丑数 Humble Numbers 题目背景 对于一给定的素数集合 S = {p1, p2, ..., pK},考虑一个正整数集合,该集合中任一元素的质因数全部属于S.这个正整数集合包括,p1.p1*p2.p1*p1.p1*p2*p3...(还有其 它).该集合被称为S集合的“丑数集合”.注意:我们认为1不是一个丑数. 题目描述 你的工作是对于输入的集合S去寻找“丑数集合”中的第N个“丑数”.所有答案可以用longint(32位整数)存储. 补充:丑数集合中每个数从小到大排列,每个丑

插入排序的优化【不靠谱地讲可以优化到O(nlogn)】 USACO 丑数

首先我们先介绍一下普通的插排,就是我们现在一般写的那种,效率是O(n^2)的. 普通的插排基于的思想就是找位置,然后插入进去,其他在它后面的元素全部后移,下面是普通插排的代码: 1 #include<iostream> 2 #include<fstream> 3 #include<stdio.h> 4 using namespace std; 5 int a[200000]; 6 int p[200000]; 7 8 int main(){ 9 ios::sync_wi