标签:
【题目】把只包含因子2、3和5的数称作丑数(Ugly Number)。
* 例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
解法一:此解提交运行超时,不推荐。
1 package com.exe11.offer; 2 3 /** 4 * 【题目】把只包含因子2、3和5的数称作丑数(Ugly Number)。 5 * 例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。 6 * @author WGS 7 * 8 */ 9 //此种方法会出现运行超时的情况、m.......................... ....... . 10 public class GetUglyNumber { 11 public boolean isUglyNumber(int number){ 12 while(number%2==0) 13 number/=2; 14 while(number%3==0) 15 number/=3; 16 while(number%5==0) 17 number/=5; 18 return (number==1)?true:false; 19 20 } 21 //返回第n个丑数 22 public int getTheUglyNumber(int n){ 23 if(n<=0) 24 return 0; 25 int count=0; 26 int uglyNum=0; 27 while(uglyNum<n){ 28 ++count; 29 if(isUglyNumber(count)){ 30 uglyNum++; 31 } 32 33 } 34 return count;//第n个丑数 35 36 } 37 public static void main(String[] args) { 38 GetUglyNumber g=new GetUglyNumber(); 39 int num=g.getTheUglyNumber(1500); 40 System.out.println(num); 41 42 } 43 44 45 46 47 }
解法二:
[思路]上种情况出现运行超时。此种方法是先建立一个数组,因为每个丑数是前几个丑数*2 *3 *5后的结果,所以先将其保存在数组当中,然后在数组中
* 匹配。如果出现相同,就将当前index+1.
package com.exe11.offer; /** * 【题目】把只包含因子2、3和5的数称作丑数(Ugly Number)。 * 例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。 * [思路]上种情况出现运行超时。此种方法是先建立一个数组,因为每个丑数是前几个丑数*2 *3 *5后的结果,所以先将其保存在数组当中,然后在数组中 * 匹配。如果出现相同,就将当前index+1. * @author WGS * */ public class GetUglyNumber_Solution2 { public int getUglyNumber(int num){ if(num<=0) return 0; int[] uglyNumbers=new int[num]; int nextUglyNumberIndex=1; uglyNumbers[0]=1; int multiplyNumber2=0; int multiplyNumber3=0; int multiplyNumber5=0; while(nextUglyNumberIndex<num){ int min=getMin(uglyNumbers[multiplyNumber2]*2, uglyNumbers[multiplyNumber3]*3, uglyNumbers[multiplyNumber5]*5); uglyNumbers[nextUglyNumberIndex]=min;//将三者最小的丑数值依次放入数组第1.。。1500个值当中 nextUglyNumberIndex++; if(uglyNumbers[multiplyNumber2]*2==min)//如果当前值刚好是这个丑数,就自增一 multiplyNumber2++; if(uglyNumbers[multiplyNumber3]*3==min) multiplyNumber3++; if(uglyNumbers[multiplyNumber5]*5==min) multiplyNumber5++; } int uglyNum=uglyNumbers[nextUglyNumberIndex-1]; return uglyNum; } private int getMin(int multiplyNumber2, int multiplyNumber3, int multiplyNumber5) { int min=(multiplyNumber2<multiplyNumber3)?multiplyNumber2:multiplyNumber3; return (min<multiplyNumber5)?min:multiplyNumber5; } public static void main(String[] args) { GetUglyNumber_Solution2 g2=new GetUglyNumber_Solution2(); int n=g2.getUglyNumber(1500); System.out.println(n); } }
标签:
原文地址:http://www.cnblogs.com/noaman/p/5650385.html