剑指Offer 面试题49:丑数

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

下面是用空间换时间的解法:

public class Topic_49 {
    public static void main(String[] args) {
        System.out.println("第1500个丑数是:" + getUglyNum(1500));
        System.out.println("第6个丑数是:" + getUglyNum(6));
        System.out.println("第5个丑数是:" + getUglyNum(5));
    }

    /**
     * 计算第index个丑数是多少
     *
     * @param index
     * @return
     */
    public static int getUglyNum(int index) {
        if (index <= 0) {
            return 0;
        }
        int[] uglyNum = new int[index]; //用来记录之前的丑数
        uglyNum[0] = 1;                 //第一个丑数是1
        int index2 = 0, index3 = 0, index5 = 0;
        int M2 = 1, M3 = 1, M5 = 1;
        for (int i = 1; i < index; i++) {
            while (uglyNum[index2] * 2 <= uglyNum[i - 1]) {
                index2++;
            }
            M2 = uglyNum[index2] * 2;
            while (uglyNum[index3] * 3 <= uglyNum[i - 1]) {
                index3++;
            }
            M3 = uglyNum[index3] * 3;
            while (uglyNum[index5] * 5 <= uglyNum[i - 1]) {
                index5++;
            }
            M5 = uglyNum[index5] * 5;
            uglyNum[i] = min(M2, M3, M5);
        }
        return uglyNum[index - 1];
    }

    public static int min(int x, int y, int z) {
        int min = (x < y) ? x : y;
        min = (min < z) ? min : z;
        return min;
    }
}

运行效果:

 剑指Offer 面试题49:丑数_第1张图片

 

 

你可能感兴趣的:(剑指Offer)