做过一道求丑陋数的面试题,下面是一篇关于丑陋数的文章,写得不错:
本文对文中的三种方法进行整理,并描述我当时的解法。
以下两种方法逐个遍历整数,筛选出丑陋数,效率太低:
1、逐个遍历,直接测试是否为丑陋数,判断依据是丑陋数去除2、3、5因子后结果为1
static
int
isUglyNumber(unsigned
int
n)
...
{
while (n%2==0)
n = n / 2;
while (n%3==0)
n = n / 3;
while (n%5==0)
n = n / 5;
return n==1;
}
unsigned
int
getUglyNumber(unsigned
int
n)
...
{
if (n > MAX_UGLY_UNMBER_COUNT || n < 1)
return 0;
unsigned int i, c;
for (i=1, c=1; c<n; c++)
...{
while (1)
...{
i++;
if (isUglyNumber(i))
break;
}
}
return i;
}
2、逐个遍历,保留遍历结果,通过在结果中查询计算是否为丑陋数,依据为丑陋数除于2、3、5的结果至少有一个是丑陋数
int
isUglyNumber1(
const
unsigned
int
*
lib,
int
len, unsigned
int
num)
...
{
int i;
// 以下为查找丑陋数简单实现,可以先对lib进行排序处理,然后通过二分查找等方法来优化;因为n是递增的所以其除于2、3、5后的结果也是
递增的,可以记录上次查找出的除于2、3、5后的结果查询位置,下一次从记录点开始查询即可。
for (i=0; i<len; i++)
...{
if (num%2==0 && lib[i]==num/2)
return 1;
if (num%3==0 && lib[i]==num/3)
&nb

本文探讨了面试中常见的算法题——求解丑陋数,即仅包含因子2、3、5的正整数。文章分析了两种低效的遍历方法,并详细介绍了两种高效算法:一种利用有序序列和指针更新,另一种采用三个队列来找到下一个最小的丑陋数。这两种方法显著提高了求解效率。
最低0.47元/天 解锁文章
176万+

被折叠的 条评论
为什么被折叠?



