码迷,mamicode.com
首页 > 其他好文 > 详细

33 丑数

时间:2017-12-31 18:52:12      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:pre   java   暴力   就是   text   while   等于   util   line   

题目描述

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

丑数只能被2,3,5整除,所以我们一直除以2,一直除以3,一直除以5 ,如果最后等于1就是丑数


解法1:暴力 超时了 最后。

 1 public class Solution {
 2     public int GetUglyNumber_Solution(int index) {
 3         int ug_cnt=0;
 4         int num =1;
 5         while(ug_cnt<index){
 6             if(isUgly(num)) ug_cnt++;
 7             num++;
 8         }
 9         return num;
10     }
11     private boolean isUgly(int num){
12         while(num %2== 0 )
13             num/=2;
14         while(num %3 == 0 )num/=3;
15         while(num %5== 0 )
16             num/=5;
17         return num==1;
18     }
19 }

解法2:

把前面已经是丑数的数保存起来。



创建一个数组,数组里面的丑数是排好序的,每一个丑数都是前面的丑数乘以2,3,5得到的。

对于乘以2,肯定存在某个丑数T2,排在它之前的每一个丑数乘以2得到的结果都会小于已有的最大的丑数,
排在T2之后的都太大。


语法问题:

int t2=0,t3=0,t5 =0;//t2,t3,t5都是下标


int t2,t3,t5 =0;//错误
Java不会默认的初始化为0
 1 import java.util.ArrayList;
 2 import java.lang.Math;
 3 public class Solution {
 4     public int GetUglyNumber_Solution(int n) {
 5         if(n<=0) return 0;
 6         ArrayList<Integer> list = new ArrayList<Integer>();
 7         list.add(1);
 8         int t2=0,t3=0,t5 =0;//t2,t3,t5都是下标
 9         while(list.size()<n){
10             int min = Math.min(list.get(t2)*2,Math.min(list.get(t3)*3,list.get(t5)*5));
11             list.add(min);
12             if(min==list.get(t2)*2) t2++;
13             if(min==list.get(t3)*3) t3++;
14             if(min==list.get(t5)*5) t5++;
15         }
16         return list.get(list.size()-1);
17     }
18 }

 

33 丑数

标签:pre   java   暴力   就是   text   while   等于   util   line   

原文地址:https://www.cnblogs.com/zle1992/p/8157989.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!