剑指Offer——面试题49:丑数

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

解决方法

♞逐个判断每个整数是不是丑数的解法,直观但不够高效
#include<iostream>
#include<algorithm>
#include<set>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;
bool isUgly(int number){  // 判断丑数 
	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(int index){
	if(index<=0) return 0;
	int number=0;
	int uglyFound=0;
	while(uglyFound<index){
		number++;
		if(isUgly(number)) uglyFound++;
	}
	return number;
}
int main() {
	printf("%d", getUglyNumber(1500));
	return 0;
}
♞创建数组保存已经找到的丑数,用空间换时间的解法
#include<iostream>
#include<algorithm>
#include<set>
#include<vector>
#include<cstring>
#include<cmath>
using namespace std;
int Min(int num1, int num2, int num3){
	return min(min(num1, num2), num3);
}
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 main() {
	printf("%d", getUglyNumber_Solution2(1500));  // 859963392
	return 0;
}
发布了52 篇原创文章 · 获赞 53 · 访问量 2572

猜你喜欢

转载自blog.csdn.net/qq_35340189/article/details/104459830