1. 程式人生 > >33 醜數

33 醜數

class cor 語法 return integer array lis blog text

題目描述

把只包含因子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 醜數