33 醜數
阿新 • • 發佈:2017-12-31
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; 3public 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 醜數