【追求进步】丑数

题目描述

把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
在线编程:
public class Solution {
    public int GetUglyNumber_Solution(int index) {
        /*
        拿到题目初步的想法即就是
        所谓的一个数m是另一个数n的因子,是指n能被m整除,也就是n%m==0
        根据丑数的定义,丑数只能被2,3,5整除。也就是说如果一个数能被2整除,我们把它连续除以2;
        如果能被3整除,就连续除以3;
        如果能被5整除,就连续除以5;
        如果最后我们得到的是1,那么这个数就是丑数,否则不是
        
      
        if(index<=0){
            return 0;
        }
        int number=0;
        int uglyFound=0;
        while(uglyFound<index){
            ++number;
            if(IsUgly(number)){
                ++uglyFound;
            }
        }
        return number;
    }
     public boolean 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;
        }
          */
       //第二种方法
        if(index<=0){
            return 0;
        }
        int [] pUglynumber=new int[index]; //存放丑数的数组
        pUglynumber[0]=1;//1就是最小的丑数
        int nextuglyindex=1; //下一个丑数的索引
        int p2=0;
        int p3=0;
        int p5=0;
        while(nextuglyindex<index){
            //分别用2,3,5乘以丑数,求出最小的丑数
            int min=min(pUglynumber[p2]*2,pUglynumber[p3]*3,pUglynumber[p5]*5);
            
            pUglynumber[nextuglyindex]=min;//则丑数数组中下一个丑数即就是min最小的这个丑数,本题即就是2
            
            if(pUglynumber[p2]*2<= pUglynumber[nextuglyindex]) {
               p2++;//然后p2++;p2=1
           }
             if(pUglynumber[p3]*3<= pUglynumber[nextuglyindex]) {
               p3++;
           }
             if(pUglynumber[p5]*5<= pUglynumber[nextuglyindex]) {
               p5++;
           }
            nextuglyindex++; //nextuglyindex=2
        }
        return pUglynumber[nextuglyindex-1];//第index-1个丑数
    }
    public int min(int n1,int n2,int n3){
        int min=n1<n2? n1:n2;
        return min<n3? min:n3;
    }
}
再看看别人写的,基本思想一致:简介清晰明了
public class Solution {

    public int GetUglyNumber_Solution(int index) {
        if(index == 0)
        {
            return 0;
        }
       ArrayList<Integer> res = new ArrayList<Integer>();
        res.add(1);
        int i2=0,i3=0,i5=0;
        while (res.size() < index) {
            int m2 = res.get(i2) * 2;
            int m3 = res.get(i3) * 3;
            int m5 = res.get(i5) * 5;
            int min = Math.min(m2, Math.min(m3, m5));
            res.add(min);
            if(min==m2) i2++;
            if(min==m3) i3++;
            if(min==m5) i5++;
        }
        return res.get(res.size()-1);
    }
}




你可能感兴趣的:(【追求进步】丑数)