(一)Ugly Number
题目:写一个程序来检测一个整数是不是丑数。
丑数的定义是,只包含质因子 2, 3, 5 的正整数。比如 6, 8 是丑数,14不是。默认1为丑数;
解答:若一个数可以被2或3或5整数,则将其更新为整除后的数。重复该操作直到不能被3个数中的任意一个整除。若最终结果为1,说明是丑数,否则不是;
代码:
class Solution {
public boolean isUgly(int num) {
if (num <= 0) return false;
if (num == 1) return true;
while (num >=2 && num % 2 == 0) {
num = num / 2;
}
while (num >=3 && num % 3 == 0) {
num = num / 3;
}
while (num >=5 && num % 5 == 0) {
num = num / 5;
}
return num == 1;
}
}
(二)Ugly Number II
题目:设计一个算法,找出第n个丑数,如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...为前10个丑数(n不超过1690);
解答:使用priority queue,每次poll()出最小的数,并将当前最小的数分别于2,3,5相乘后的数放入队列中(使用HashSet实时记录,避免元素重复);
代码:
class Solution {
public int nthUglyNumber(int n) {
Queue<Long> queue = new PriorityQueue<>();
Set<Long> set = new HashSet<>();
Long prime1 = Long.valueOf(2);
Long prime2 = Long.valueOf(3);
Long prime3 = Long.valueOf(5);
Long last = Long.valueOf(1);
queue.offer(last);
set.add(last);
for (int i = 0; i < n; i++) {
last = queue.poll();
if (set.add(last * prime1)) {
queue.offer(last * prime1);
}
if (set.add(last * prime2)) {
queue.offer(last * prime2);
}
if (set.add(last * prime3)) {
queue.offer(last * prime3);
}
}
return last.intValue();
}
}