题意描述:UglyNumber的定义为一个数分解后只包含2、3、5因子,比如6、8是UglyNumber而14不为UglyNumber,1是典型的UglyNumber。求第N个UglyNumber
解题思路一:逐个判断每个数字是否为UglyNumber至第N个UglyNumber为止,而判断每个数字是否为UglyNumber就是根据定义依次除去因子5、3、2,当不能再被5、3、2整除时是1就是UglyNumber,否则不为UglyNumber
boolean isUgly(int num){
if(num == 1) return true;
while((num >= 5) && (num%5 == 0)) num /= 5;
while((num >= 3) && (num%3 == 0)) num /= 3;
while((num >= 2) && (num%2 == 0)) num /= 2;
return num == 1;
}
int nthUglyNumber1(int n){
int count = 0;//计数第i个UglyNumber
int num = 1;//从1开始判断是否为UglyNumber
for(; count != n; num++){
if(isUgly(num)) count++;
}
return num-1;
}
解题思路二:由于思路一的方法相当于是暴力破解,当所求N比较大时所需要的时间就较多,那么可以改一个思路想一下,由于UglyNumber的定义就是1以及因子为2、3、5的数字,所以每个UglyNumber可以从上一个UglyNumber推出,借助该思路找到第N个UglyNumber
int nthUglyNumber(int n){
LinkedList<Integer> l1 = new LinkedList<Integer>();
LinkedList<Integer> l2 = new LinkedList<Integer>();
LinkedList<Integer> l3 = new LinkedList<Integer>();
l1.add(1);
l2.add(1);
l3.add(1);
int theNumber = 0;
for(int i=0; i<n; i++){
theNumber = Math.min(Math.min(l1.get(0), l2.get(0)), l3.get(0));
if(l1.get(0) == theNumber) l1.remove(0);
if(l2.get(0) == theNumber) l2.remove(0);
if(l3.get(0) == theNumber) l3.remove(0);
l1.add(theNumber*2);
l2.add(theNumber*3);
l3.add(theNumber*5);
}
return theNumber;
}