33 丑数

Posted 张乐乐章

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了33 丑数相关的知识,希望对你有一定的参考价值。

题目描述

把只包含因子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 丑数的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer33:丑数

[剑指offer] 33. 丑数

33.丑数

JZ33 丑数

33求按从小到大的顺序的第N个丑数

剑指offer--33.丑数