• 剑指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);
    
        }
    
    }
  • 相关阅读:
    Js获取当前浏览器的高和宽度
    js中使用键盘键,每个键的值
    网络搜索之实现网络蜘蛛
    进程和线程
    jquery.bgiframe.js在IE9下的错误
    [习题]GridView样版内部,改用CheckBox/Radio/DropDownList(单/复选)控件,取代TextBox
    [入门]C#语法里面,如何使用 VB的常用函数?(using Microsoft.VisualBasic)
    [全文下载/试读]补充,上集Ch. 3 Panel控件与常用属性,范例:问卷系统,动态产生「子问题」(使用障眼法)
    [ASP.NET] 上课 第一天的简介
    TextBox的 TextChanged事件#1 动态给予默认值,会触发TextChanged事件吗? / #2 EnableViewState属性是做什么用?
  • 原文地址:https://www.cnblogs.com/noaman/p/5650385.html
Copyright © 2020-2023  润新知