您的位置:首页 > 职场人生

【面试题34】丑数

2016-08-30 20:44 405 查看


题目描述

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

此解法算法运算超时

public class Solution {
public int GetUglyNumber_Solution(int num) {
if(num<=0) return 0;
if(num==1) return 1;
int count=0;
int i=0;
while(count < num){
i++;
if(IsUglyNum(i))
count++;
if(count==num)
return i;
}
return 0;
}

private boolean IsUglyNum(int num){
while(num % 2==0)
num=num/2;
while(num % 3==0)
num=num/3;
while(num % 5==0)
num=num/5;

if(num==1)
return true;
return false;
}
}

更优的解法:

public class Solution {
//[思路]上种情况出现运行超时。此种方法是先建立一个数组,因为每个丑数是前几个丑数*2 *3 *5后的结果,所以先将其保存在数组当中,然后在数组中
//* 匹配。如果出现相同,就将当前index+1.
public int GetUglyNumber_Solution(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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: