您的位置:首页 > 职场人生

面试题34:丑数

2016-07-12 15:52 316 查看
题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。

分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题。

所谓一个数m是另一个数n的因子,是指n能被m整除,也就是n % m == 0。根据丑数的定义,丑数只能被2、3和5整除。也就是说如果一个数如果它能被2整除,我们把它连续除以2;如果能被3整除,就连续除以3;如果能被5整除,就除以连续5。如果最后我们得到的是1,那么这个数就是丑数,否则不是。

{
while(number % 2 == 0)
number /= 2;
while(number % 3 == 0)
number /= 3;
while(number % 5 == 0)
number /= 5;

return (number == 1) ? true : false;
}

int GetUglyNumber_Solution1(int index)
{
if(index <= 0)
return 0;

int number = 0;
int uglyFound = 0;
while(uglyFound < index)
{
++number;

if(IsUgly(number))
{
++uglyFound;
}
}

return number;
}


方法二:用空间换时间,创建数组保存已找到的丑数

设置三个指针,开始都指向数组的第一个元素,三个指针分别负责*2,*3,*5。用乘后的结果中最小的那个数更新数组,并与数组中最大的那个丑数比较,如果乘后的结果小于数组中最大丑数,那么这个指针就可以++(因为小于结果中最大的丑数已经存在了)

int Min(int number1, int number2, int number3);

int GetUglyNumber_Solution2(int index)
{
if(index <= 0)
return 0;

int *pUglyNumbers = new int[index];
pUglyNumbers[0] = 1;
int nextUglyIndex = 1;

int *pMultiply2 = pUglyNumbers;
int *pMultiply3 = pUglyNumbers;
int *pMultiply5 = pUglyNumbers;

while(nextUglyIndex < index)
{
int min = Min(*pMultiply2 * 2, *pMultiply3 * 3, *pMultiply5 * 5);
pUglyNumbers[nextUglyIndex] = min;

while(*pMultiply2 * 2 <= pUglyNumbers[nextUglyIndex])
++pMultiply2;
while(*pMultiply3 * 3 <= pUglyNumbers[nextUglyIndex])
++pMultiply3;
while(*pMultiply5 * 5 <= pUglyNumbers[nextUglyIndex])
++pMultiply5;

++nextUglyIndex;
}

int ugly = pUglyNumbers[nextUglyIndex - 1];
delete[] pUglyNumbers;
return ugly;
}

int Min(int number1, int number2, int number3)
{
int min = (number1 < number2) ? number1 : number2;
min = (min < number3) ? min : number3;

return min;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: