/** * @param {number} n * @return {number} */var nthUglyNumber = function (n) { let ugly = []; // 存储所有的丑数
// 分别枚举所有质因数为2、3、5的数,将其存入数组 // 0x7FFFFFFF即为最大的32位二进制数,即0b1111111111111111111111111111111 // 对应的是10进制数2147483647,计算出的丑数长度为1691 for (let i = 1; i <= 0x7fffffff; i *= 2) { for (let j = i; j <= 0x7fffffff; j *= 3) { for (let k = j; k <= 0x7fffffff; k *= 5) { ugly.push(k); } } }
// 由于每层循环都是在上层循环的结果基础上进行计算,例如在i和j都等于1的情况下,先计算了所有k*=5的结果 // 用此方法计算出的丑数并不是按大小排序,因此只能将所有丑数计算出来,再进行排序取需要的值 ugly.sort((a, b) => a - b);
// 取出第n个丑数 return ugly[n - 1];};
评论