第一种:没有看其他解法,自己写的解法:
1.写一个无限循环,然后如果当前数是丑数,则count++;
2.如果count == n;则凑齐了n个丑数,返回
3.如果当前数不在丑数集合中(初始化为[1, 2, 3, 5]);
4.如果当前丑数大于6,则需要判断,如果这个数的约数只有1和他本身,则这个数不是丑数
5.进行拆分,判断这个数的约数是否为丑数,如果有不为丑数的输入false,进入1,否则将这个数放到丑数集合中进行1
// 迭代判断一个数是否为丑数
const isUglyNum = function(n, arr) {
if (arr.indexOf(n) != -1) {
return true;
} else if (n > 6) {
var sum = 0;
for (var i = 1; i <= n; i++) {
if (n % i == 0) {
sum++;
}
}
if (sum == 2) {
return false;
}
for (var i = 1; i < n; i++) {
if (n % i == 0) {
if (!isUglyNum(i, arr)) {
return false;
}
}
}
arr.push(n);
}
return true;
}
/**
* 判断一个是否为丑数
* @param {整数} n
*/
const getNUglyNum = function(n) {
var all = [];
var count = 0;
var arr = [1, 2, 3, 5];
for (var i = 1; ; i++) {
if (count == n) {
break;
}
// 判读i和i的约数是是否为丑数
if(isUglyNum(i, arr)) {
all.push(i);
count++;
}
}
console.log(all);
}
第二种:标准解法,简言之丑数解释2, 3, 5的组合数,根据从小到大,组合这几个数就可以了
var getUglyNum = function (index) {
if (index === 0) return 0;
var uglyNum = [1];
var factor2 = 0,
factor3 = 0,
factor5 = 0;
for (var i = 1; i < index; i++) {
uglyNum[i] = Math.min(uglyNum[factor2] * 2, uglyNum[factor3] * 3, uglyNum[factor5] * 5);
if (uglyNum[i] === uglyNum[factor2] * 2) factor2++;
if (uglyNum[i] === uglyNum[factor3] * 3) factor3++;
if (uglyNum[i] === uglyNum[factor5] * 5) factor5++;
}
return uglyNum[index - 1];
}