Description:
Write a program to find the n
-th ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5
. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12
is the sequence of the first 10
ugly numbers.
Note that 1
is typically treated as an ugly number.
Solution:
First we notice that the return value is Integer, then noticing that we can have only 31 numbers for 2^n less than Integer.MAX_VALUE. This condition is the same as 3 and 5. So we may as well get all the ugly numbers.
<span style="font-size:18px;">import java.util.*;
import java.util.Map.Entry;
public class Solution {
public int nthUglyNumber(int n) {
TreeMap<Integer, Integer> map = new TreeMap<Integer, Integer>();
map.put(1, 0);
LinkedList<Integer> list = new LinkedList<Integer>();
list.add(5);
while (!list.isEmpty()) {
int key = list.poll();
if (map.containsKey(key))
continue;
map.put(key, 0);
long temp = 1l * key;
if (temp * 5l <= Integer.MAX_VALUE)
list.add((int) (temp * 5l));
}
list.add(3);
while (!list.isEmpty()) {
int key = list.poll();
if (map.containsKey(key))
continue;
map.put(key, 0);
long temp = 1l * key;
if (temp * 5l <= Integer.MAX_VALUE)
list.add((int) (temp * 5l));
if (temp * 3l <= Integer.MAX_VALUE)
list.add((int) (temp * 3l));
}
list.add(2);
while (!list.isEmpty()) {
int key = list.poll();
if (map.containsKey(key))
continue;
map.put(key, 0);
long temp = 1l * key;
if (temp * 5l <= Integer.MAX_VALUE)
list.add((int) (temp * 5l));
if (temp * 3l <= Integer.MAX_VALUE)
list.add((int) (temp * 3l));
if (temp * 2l <= Integer.MAX_VALUE)
list.add((int) (temp * 2l));
}
int arr[] = new int[map.size()];
int tot = 0;
for (Iterator<Integer> ite = map.keySet().iterator(); ite.hasNext();) {
arr[tot++] = ite.next();
}
return arr[n - 1];
}
}</span>