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

解法一:此解提交运行超时,不推荐。

 package com.exe11.offer;

 /**
* 【题目】把只包含因子2、3和5的数称作丑数(Ugly Number)。
* 例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
* @author WGS
*
*/
//此种方法会出现运行超时的情况、m.......................... ....... .
public class GetUglyNumber {
public boolean isUglyNumber(int number){
while(number%2==0)
number/=2;
while(number%3==0)
number/=3;
while(number%5==0)
number/=5;
return (number==1)?true:false; }
//返回第n个丑数
public int getTheUglyNumber(int n){
if(n<=0)
return 0;
int count=0;
int uglyNum=0;
while(uglyNum<n){
++count;
if(isUglyNumber(count)){
uglyNum++;
} }
return count;//第n个丑数 }
public static void main(String[] args) {
GetUglyNumber g=new GetUglyNumber();
int num=g.getTheUglyNumber(1500);
System.out.println(num); } }

解法二:

[思路]上种情况出现运行超时。此种方法是先建立一个数组,因为每个丑数是前几个丑数*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); } }
04-02 02:45