46. 谷歌面试题:寻找丑数
题目:我们把仅仅包括因子2、3和5的数称作丑数(Ugly Number)。比如6、8都是丑数,但14不是,由于它包括因子7。
习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。
分析:这是一道在网络上广为流传的面试题,据说google以前採用过这道题。
这段题刚開始的想法是从1開始递增遍历,找出1500个是丑数的数,并打印出来。
实现例如以下:
#include<stdio.h> #include<string.h> #include<iostream> #include<stdlib.h> using namespace std; bool isUgly(int d) { while(d%2 == 0) d/=2; while(d%3 == 0) d/=3; while(d%5 == 0) d/=5; if(d == 1) return true; return false; } void printUglyN(int num) { int k = 0; for(int i= 1; k < num; i ++) { if(isUgly(i)) { k++; cout << i << "\t"; } } } int main() { printUglyN(1500); return 0; }
上面计算次数非常多,能够採用一种简单的方法,思想非常精妙。后面的数是前面数的基础上*2或3或5得到的。
能够用三个指针指向乘以2,乘以3,乘以5后位置。
请看算法实现:
#include<stdio.h> #include<string.h> #include<iostream> #include<stdlib.h> //#define min(a, b, c) ((((a)>(b))?
(b):(a)) > (c)) ?
c : (((a)>(b))?(b):(a)) using namespace std; int min(int a, int b, int c) { int t = a > b ?
b : a; return t> c ? c:t; } void findUglyN(int *uglys, int num) { uglys[0] = 1; int p2 = 0; int p3 = 0; int p5 = 0; int i = 1; while( i < num) { uglys[i] = min(uglys[p2]*2, uglys[p3]*3, uglys[p5]*5); if(uglys[i] == uglys[p2]*2) p2++; if(uglys[i] == uglys[p3]*3) p3++; if(uglys[i] == uglys[p5]*5) p5++; i++; } } int main() { int num = 1500; int *uglys = new int[num]; findUglyN(uglys, num); for(int i = 0; i < num; i++) cout << uglys[i] << "\t"; delete[] uglys; return 0; }
posted on 2019-04-11 15:51 xfgnongmin 阅读(127) 评论(0) 编辑 收藏 举报