【面试题34】丑数

【题目描述】

我们把只包含因子2,3和5的数称作丑数,求按从小到大的顺序的第1500个丑数。

例如6,8都是丑数,但是14不是,因为它包含因子7。

习惯上,我们把1当做第一个丑数。

【解决方案】

解法一:逐个判断,直观但不够高效

我的代码实现,仅供参考:

 1         public static int GetUglyNumber(int num)
 2         {
 3             if (num <= 0)
 4                 return 0;
 5 
 6             int result = 0, count = 0;
 7 
 8             while (count < num)
 9             {
10                 result++;
11 
12                 if (IsUglyNumber(result))
13                     count++;
14             }
15 
16             return result;
17         }
18 
19         public static bool IsUglyNumber(int num)
20         {
21             while (num % 2 == 0)
22                 num /= 2;
23 
24             while (num % 3 == 0)
25                 num /= 3;
26 
27             while (num % 5 == 0)
28                 num /= 5;
29 
30             return num == 1 ? true : false;
31         }

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

我的代码实现,仅供参考:

 1         public static int GetUglyNumber(int index)
 2         {
 3             if (index <= 0)
 4                 return 0;
 5 
 6             int[] arr = new int[index];
 7             int nextIndex = 1;
 8             int index2 = 0;
 9             int index3 = 0;
10             int index5 = 0;
11             arr[0] = 1;
12 
13             while (nextIndex < index)
14             {
15                 int min = Min(arr[index2] * 2, arr[index3] * 3, arr[index5] * 5);
16                 arr[nextIndex] = min;
17 
18                 while (arr[index2] * 2 <= arr[nextIndex])
19                     index2++;
20 
21                 while (arr[index3] * 3 <= arr[nextIndex])
22                     index3++;
23 
24                 while (arr[index5] * 5 <= arr[nextIndex])
25                     index5++;
26 
27                 nextIndex++;
28             }
29 
30             return arr[nextIndex - 1];
31         }
32 
33         public static int Min(int a, int b, int c)
34         {
35             int min = a > b ? b : a;
36 
37             return min > c ? c : min;
38         }

 

posted @ 2015-09-21 10:58  叫我霍啊啊啊  阅读(188)  评论(0编辑  收藏  举报