丑数问题
题目描述:
规定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];
}