《程式設計師程式碼面試指南》醜數問題——java實現
阿新 • • 發佈:2018-12-10
醜數問題
題目描述:
規定1是醜數,其他的數如果只含有2或3或5的因子,那麼這個 數也是醜數。 比如依次的醜數為:1,2,3,4,5,6,8,9,10,12,15… 求第n個醜數
題目難度:
題目思路:
思路一: 本題要求出第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];
}