题目描述:
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。
习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
解法1:逐个判断每个数是不是丑数,解法直观,但不高效。
如果一个数能被2整除,就连续除2,能被3整除,就连续除3,能被5整除,就连续除5,如果最后得到的是1,那么这个数就是丑数。
//判断这个数是不是丑数
public class UglyNumber {
public static boolean isUgly(int num){
while (num%2==0){
num/=2;
}
while (num%3==0){
num/=3;
}
while (num%5==0){
num/=5;
}
return num==1?true:false;
}
//按照顺序判断每个整数是不是丑数
public int GetUglyNumber_Solution(int index){
if(index<=0){
return 0;
}
int number=0;
int uglynum=0;
while(uglynum<index){
number++;
if (isUgly(number)){
uglynum++;
}
}
return number;
}
}
解法2:创建动态数组保存已找到的丑数,空间换时间。
import java.util.ArrayList;
public class UglyNumber {
public int GetUglyNumber_Solution(int index) {
if(index<=0){
return 0;
}
//创建动态数组
ArrayList<Integer> list=new ArrayList<Integer>();
list.add(1);
int n2=0,n3=0,n5=0;
while(list.size()<index){
int min2=list.get(n2)*2;
int min3=list.get(n3)*3;
int min5=list.get(n5)*5;
//我们只用比较3个数:
//用于乘2的最小的数、用于乘3的最小的数,用于乘5的最小的
int min=Math.min(min2,Math.min(min3,min5));
list.add(min);
if (min==min2) n2++;
if (min==min3) n3++;
if (min==min5) n5++;
}
return list.get(list.size()-1);
}
测试用例:
package com.wyb.uglynumber;
public class Test {
public static void main(String[] args) {
UglyNumber un=new UglyNumber();
System.out.println(un.GetUglyNumber_Solution(1500));
}
}