剑指offer-问题34

package offer;

/**
 * offer interview 34
 */
public class Test34 {

    //method 1
    private static boolean isUgly(int num){
        while (num % 2 == 0){
            num /= 2;
        }

        while (num % 3 == 0){
            num /= 3;
        }

        while (num % 5 == 0){
            num /= 5;
        }

        return num == 1;
    }

    public static int getUglyNumber(int index){
        if (index <= 0){
            return 0;
        }

        int num = 0;
        int uglyFound = 0;

        while (uglyFound <  index){
            num++;
            if (isUgly(num)){
                ++uglyFound;
            }
        }

        return num;
    }

    private static void test1(){
        System.out.println(getUglyNumber(1));
        System.out.println(getUglyNumber(2));
        System.out.println(getUglyNumber(3));
        System.out.println(getUglyNumber(4));
        System.out.println(getUglyNumber(5));
        System.out.println(getUglyNumber(6));
        System.out.println(getUglyNumber(7));
        System.out.println(getUglyNumber(8));
        System.out.println(getUglyNumber(9));
        System.out.println(getUglyNumber(10));
        System.out.println(getUglyNumber(11));
        System.out.println(getUglyNumber(1500));
        System.out.println(getUglyNumber(0));
     }


     //method 2
    public static int getUglyNumber2(int index){
        if (index <= 0){
            return 0;
        }

        int[] pUglyNumbers = new int[index];
        pUglyNumbers[0] = 1;
        int nextUglyIndex = 1;

        int p2 = 0;
        int p3 = 0;
        int p5 = 0;

        while (nextUglyIndex < index){
            int min = min(pUglyNumbers[p2] * 2,pUglyNumbers[p3] * 3,pUglyNumbers[p5] * 5);
            pUglyNumbers[nextUglyIndex] = min;

            while (pUglyNumbers[p2] * 2 <= pUglyNumbers[nextUglyIndex]){
                p2++;
            }

            while (pUglyNumbers[p3] * 3 <= pUglyNumbers[nextUglyIndex]){
                p3++;
            }
            while (pUglyNumbers[p5] * 5 <= pUglyNumbers[nextUglyIndex]){
                p5++;
            }

            nextUglyIndex++;

        }
        return pUglyNumbers[nextUglyIndex -1];
    }

    private static int min(int n1 ,int n2 ,int n3){
        int min = n1 < n2 ? n1 : n2;
        return min < n3 ? min : n3;
    }

    private static void test2(){
        System.out.println(getUglyNumber2(1));
        System.out.println(getUglyNumber2(2));
        System.out.println(getUglyNumber2(3));
        System.out.println(getUglyNumber2(4));
        System.out.println(getUglyNumber2(5));
        System.out.println(getUglyNumber2(6));
        System.out.println(getUglyNumber2(7));
        System.out.println(getUglyNumber2(8));
        System.out.println(getUglyNumber2(9));
        System.out.println(getUglyNumber2(10));
        System.out.println(getUglyNumber2(11));
        System.out.println(getUglyNumber2(1500));
        System.out.println(getUglyNumber2(0));
     }


    public static void main(String[] args){
//        System.out.println("Solution 1:");
//        test1();
//        System.out.println();

        System.out.println("Solution 2:");
        test2();
        System.out.println();
    }




}

=======

欢迎关注群聊:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值