zoukankan      html  css  js  c++  java
  • 【剑指offer】面试题34:丑数

    题目:

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

    思路:

    第一个丑数是1,此后保存3个下标:乘以2的数位置、乘以3的数位置、乘以5的数位置。每次比较由2、3、5衍生出来的丑数的大小,取最小的作为下一个丑数。

    维护这3个下标:判断下一个丑数是由2、3还是5衍生的,那个数的下标位置前进1.

    需要注意的是,下一个丑数可能是其中两个或三个数衍生的,比如在生成6时,2衍生的是6,3在那个时候衍生的恰好也是6.这样,2和3的下标都要移动1,否则下一个又生成了一遍6.

    代码:

    class Solution {
    public:
        int GetUglyNumber_Solution(int index) {
            if(index<=0)  return 0;
            
            int ugly[index];
            int cur=0;
            ugly[cur++]=1;
            int index2=0;
            int index3=0;
            int index5=0;
            for(;cur<index;cur++)
            {
                ugly[cur]=min(ugly[index2]*2,ugly[index3]*3,ugly[index5]*5);
                
                if(ugly[cur]==ugly[index2]*2) index2++;
                if(ugly[cur]==ugly[index3]*3) index3++;//这里不能用else if,因为可能存在2、3、5衍生的数相等且最小
                if(ugly[cur]==ugly[index5]*5) index5++;
            }
            return ugly[index-1];
        }
    private:
        int min(int x, int y, int z)
        {
            int res=x<y?x:y;
            res=res<z?res:z;
            return res;
        }
    };
  • 相关阅读:
    基于centos的freeradius高可用lvs(UDP)
    sql server 2012的AlwaysOn高可用
    python基础题型一
    用户访一个APP或者网页流程示意图
    DNS解析流程
    crontab的定时任务实例
    Xcode设置
    Nvidia Nsight + .NET
    C++ Pointer-to-Member Selector
    C++11
  • 原文地址:https://www.cnblogs.com/buxizhizhou/p/4727384.html
Copyright © 2011-2022 走看看