1. 程式人生 > >《程式設計師程式碼面試指南》醜數問題——java實現

《程式設計師程式碼面試指南》醜數問題——java實現

醜數問題

題目描述:

規定1是醜數,其他的數如果只含有2或3或5的因子,那麼這個 數也是醜數。 比如依次的醜數為:1,2,3,4,5,6,8,9,10,12,15… 求第n個醜數

題目難度:

easy

題目思路:

思路一: 本題要求出第n個醜數,分為兩個步驟: 1、找醜數: 醜數是含有2或3或5因子的數,因此即從1開始遍歷所有整數,如果該數能被2或3或5整除,且除到最後的結果為1,則該數為醜數。 2、求個數: 如果當前數為醜數,則cnt++。直到找到第n個醜數。

程式碼實現:

    public static int findUglyNum(int n){
        if (n <
0){ return 0; } int cnt = 0; int number = 0; while (cnt < n){ number++; if (isUgly(number)){ cnt++; } } return number; } private static boolean isUgly(int number) { while
(number % 2 == 0){ number = number / 2; } while (number % 3 == 0){ number = number / 3; } while (number % 5 == 0){ number = number / 5; } return number == 1 ; }

思路二: 從1位置開始,後面所有的醜數都是由2或3或5相乘得來的。 1、要求第n個醜數,則申請長度為n的陣列來放這n個醜數。 2、讓2 、3、5這三個數剛開始時都在1的位置。然後讓1*2就出來下一位的醜數了,此時2指標的位置要往後移一位,比較2 * 2 和 1 * 3 的大小,然後分別移動相應指標。並把醜數新增到陣列中。

程式碼實現:

    public static int isUglyNum(int n){
        int[] help = new int[n];
        int index2 = 0;
        int index3 = 0;
        int index5 = 0;
        int index  = 1;
        help[0] = 1;
        while (index < n){
            help[index] = Math.min(help[index2] * 2, Math.min(help[index3] * 3,help[index5] * 5));   //找出最小的,存入的當前位置
            if (help[index] == help[index2] * 2){      //如果當前位置是由因子2得到
                index2++;                                  //2指標所在的位置後移一位
            }
            if (help[index] == help[index3] * 3){
                index3++;
            }
            if (help[index] == help[index5] *5){
                index5++;
            }
            index++;
        }
        return help[n -1];
    }