题目:我们把只包含因子2、3、5的数称作丑数(Ugly Number)。求从小到大的顺序的第1500个丑数。例如,6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做第一个丑数。
package offer;
import java.util.ArrayList;
import java.util.Scanner;
public class Solution49 {
/*
* 解法一:剑指offer解法1 根据丑数的定义,丑数只能被2、3、5整除。 也就是说,如果一个数能被2整除,就连续除以2;如果能被3整除,就连续除以3;
* 如果能被5整除,就连续除以5。如果最后得到的是1,那么这个数就是丑数。 这个解法时间复杂度太高了!
*/
public int GetUglyNumber_Solution1(int index) {
if (index <= 0)
return 0;
int number = 0;
int uglyFound = 0;
while (uglyFound < index) {
++number;
if (IsUgly(number)) {
++uglyFound;
}
}
return number;
}
public boolean IsUgly(int number) {
while (number % 2 == 0)
number /= 2;
while (number % 3 == 0)
number /= 3;
while (number % 5 == 0)
number /= 5;
if (number == 1)
return true;
else
return false;
}
/*
* 解法二: 我们只用比较3个数: 用于乘2的最小的数、用于乘3的最小的数,用于乘5的最小的
*/
public int GetUglyNumber_Solution2(int index) {
if (index <= 0)
return 0;
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(1);
int i2 = 0, i3 = 0, i5 = 0;
while (list.size() < index) {
int m2 = list.get(i2) * 2;
int m3 = list.get(i3) * 3;
int m5 = list.get(i5) * 5;
int min = Math.min(m2, Math.min(m3, m5));
list.add(min);
if (min == m2)
i2++;
if (min == m3)
i3++;
if (min == m5)
i5++;
}
return list.get(list.size() - 1);
}
public static void main(String[] args) {
Solution49 sl = new Solution49();
Scanner scanner = new Scanner(System.in);
System.out.print("请输入索引号index=");
int index = scanner.nextInt();
System.out.println("第" + index + "个丑数为:" + sl.GetUglyNumber_Solution2(index));
}
}