本题目源自剑指offer第34题
题目:我们把只包含因子2,3,4的数称作丑数,求按从小到大的顺序的第1500个丑数,例如6,8都是丑数但14不是因为它包含因子7,习惯上把1当做第一个丑数
分析:在面试的过程中首先想到最简单的方法从1开始遍历判断每个数是不是丑数。
还有面试中最常用的方法是空间换时间
本体的第二种解法就是空间换时间的做法
/*
丑数是只包含2 3 5因子的数
问题为求出第1500个丑数
解决方法为空间换时间
*/
#include<iostream>
using namespace std;
int Min3(int k1,int k2, int k3);
int GetUglyNumber_Solution(int index)
{
if(index < 0)
return -1;
int *pUglyNumbers = new int[index];
pUglyNumbers[0] = 1;
int next=1;
int *P2 = pUglyNumbers;
int *P3 = pUglyNumbers;
int *P5 = pUglyNumbers;
while (next<index)
{
int min = Min3(*P2*2,*P3*3,*P5*5);
pUglyNumbers[next]=min;
while(*P2*2<=min)
++P2;
while(*P3*3<=min)
++P3;
while(*P5*5<=min)
++P5;
next++;
}
int ret = pUglyNumbers[index - 1 ];
delete pUglyNumbers;
return ret;
// delete pUglyNumbers;
}
int Min3(int k1,int k2, int k3)
{
int min = k1<k2?k1:k2;
return k3<min?k3:min;
}
int main()
{
/**
测试用例为第1,2,5 10,15 1500个
**/
cout<<GetUglyNumber_Solution(1)<<endl;
cout<<GetUglyNumber_Solution(2)<<endl;
cout<<GetUglyNumber_Solution(5)<<endl;
cout<<GetUglyNumber_Solution(10)<<endl;
cout<<GetUglyNumber_Solution(15)<<endl;
cout<<GetUglyNumber_Solution(1500)<<endl;
}