zoukankan      html  css  js  c++  java
  • 剑指offer系列59---寻找丑数

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

    解法一:此解提交运行超时,不推荐。

     1 package com.exe11.offer;
     2 
     3 /**
     4  * 【题目】把只包含因子2、3和5的数称作丑数(Ugly Number)。
     5  *             例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
     6  * @author WGS
     7  *
     8  */
     9 //此种方法会出现运行超时的情况、m..........................    .......    .                                
    10 public class GetUglyNumber {
    11         public boolean isUglyNumber(int number){
    12             while(number%2==0)
    13                 number/=2;
    14             while(number%3==0)
    15                 number/=3;
    16             while(number%5==0)
    17                 number/=5;
    18             return (number==1)?true:false;
    19             
    20         }
    21         //返回第n个丑数
    22         public int getTheUglyNumber(int n){
    23             if(n<=0)
    24                 return 0;
    25             int count=0;
    26             int uglyNum=0;
    27             while(uglyNum<n){
    28                 ++count;
    29                 if(isUglyNumber(count)){
    30                     uglyNum++;
    31                 }
    32                 
    33             }
    34             return count;//第n个丑数
    35             
    36         }
    37         public static void main(String[] args) {
    38             GetUglyNumber g=new GetUglyNumber();
    39             int num=g.getTheUglyNumber(1500);
    40             System.out.println(num);
    41             
    42         }
    43         
    44         
    45         
    46         
    47 }

    解法二:

    [思路]上种情况出现运行超时。此种方法是先建立一个数组,因为每个丑数是前几个丑数*2 *3 *5后的结果,所以先将其保存在数组当中,然后在数组中
    * 匹配。如果出现相同,就将当前index+1.

    package com.exe11.offer;
    
    /**
     * 【题目】把只包含因子2、3和5的数称作丑数(Ugly Number)。
     *             例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
     * [思路]上种情况出现运行超时。此种方法是先建立一个数组,因为每个丑数是前几个丑数*2 *3 *5后的结果,所以先将其保存在数组当中,然后在数组中
     *         匹配。如果出现相同,就将当前index+1.
     * @author WGS
     *
     */
    public class GetUglyNumber_Solution2 {
        
        public int getUglyNumber(int num){
            if(num<=0)
                return 0;
            int[] uglyNumbers=new int[num];
            int nextUglyNumberIndex=1;
            uglyNumbers[0]=1;
            int multiplyNumber2=0;
            int multiplyNumber3=0;
            int multiplyNumber5=0;
            while(nextUglyNumberIndex<num){
                int min=getMin(uglyNumbers[multiplyNumber2]*2,
                               uglyNumbers[multiplyNumber3]*3,
                               uglyNumbers[multiplyNumber5]*5);
                uglyNumbers[nextUglyNumberIndex]=min;//将三者最小的丑数值依次放入数组第1.。。1500个值当中
                nextUglyNumberIndex++;
                if(uglyNumbers[multiplyNumber2]*2==min)//如果当前值刚好是这个丑数,就自增一
                    multiplyNumber2++;
                if(uglyNumbers[multiplyNumber3]*3==min)
                    multiplyNumber3++;
                if(uglyNumbers[multiplyNumber5]*5==min)
                    multiplyNumber5++;
                
            }
            int uglyNum=uglyNumbers[nextUglyNumberIndex-1];
            return uglyNum;
            
            
        }
        private int getMin(int multiplyNumber2, int multiplyNumber3, int multiplyNumber5) {
            int min=(multiplyNumber2<multiplyNumber3)?multiplyNumber2:multiplyNumber3;
            
            return (min<multiplyNumber5)?min:multiplyNumber5;
        }
        public static void main(String[] args) {
            GetUglyNumber_Solution2 g2=new GetUglyNumber_Solution2();
            int n=g2.getUglyNumber(1500);
            System.out.println(n);
    
        }
    
    }
  • 相关阅读:
    android学习十四(android的接收短信)
    C/C++知识要点4——printf函数以及cout的计算顺序
    HDU 5355 Cake(2015多校第六场,搜索 + 剪枝)
    微信错误提示code= -4/微信发送被拒绝
    struts2的validate在使用过程中的一个问题
    28.字符串的排列
    Redis入门经典——The Little Redis Book (翻译)
    POJ 3155 Hard Life(最大密度子图)
    BZOJ 1798 AHOI2009 Seq 维护序列 线段树
    RT-Thread开篇
  • 原文地址:https://www.cnblogs.com/noaman/p/5650385.html
Copyright © 2011-2022 走看看