题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
练习地址
实现
方法2:直观方法
方法1:空间换时间
方法2→参考:https://www.jianshu.com/p/96a01e54464a
// 方法2:空间换时间
static int getUglyNum(int index){
// 0-6的丑数分别为0-6
if (index < 7) return index;
//p2,p3,p5分别为三个队列的指针,newNum为从队列头选出来的最小数
int p2 = 0, p3 = 0, p5 = 0, newNum = 1;
List<Integer> arr = new ArrayList<>();
arr.add(newNum);
while (arr.size() < index) {
//选出三个队列头最小的数
newNum = Math.min(arr.get(p2) * 2, Math.min(arr.get(p3) * 3, arr.get(p5) * 5));
//这三个if有可能进入一个或者多个,进入多个是三个队列头最小的数有多个的情况
if (arr.get(p2) * 2 == newNum) p2++;
if (arr.get(p3) * 3 == newNum) p3++;
if (arr.get(p5) * 5 == newNum) p5++;
arr.add(newNum);
}
return newNum;
}
}
方法1→
public class C49_num_UglyNumber {
// 方法1:
static boolean isUgly(int num) {
//n能被m整除,即n%m==0
while (num % 2 == 0) {//
num /= 2;
}
while (num % 3 == 0) {
num /= 3;
}
while (num % 5 == 0) {
num /= 5;
}
return num == 1;
}
static int getUglyNum(int index) {
if (index <= 0) return 0;
int num = 0;
int uglyFound = 0;
while (uglyFound < index) {
num++;
if (isUgly(num)) {
uglyFound++;
}
}
return num;
}
}
Test
public static void main(String[] args) {
int index = 1500;
System.out.println(getUglyNum(index));
}