【面试题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;
}
}
相关文章推荐
- 面试题34:丑数
- 面试题34:丑数
- 【剑指Offer学习】【面试题34:丑数】
- 剑指offer-面试题34:丑数
- 剑指Offer系列-面试题34:丑数
- 时间效率与空间效率的平衡-面试题34-丑数
- 面试题34:丑数
- 剑指offer--面试题34: 丑数
- 《剑指Offer》学习笔记--面试题34:丑数
- 剑指offer——面试题34:丑数
- 【剑指Offer】面试题34:丑数
- 面试题 34 丑数
- 面试题34:丑数
- 面试题34 丑数
- 面试题34_丑数
- 剑指offer面试题34:丑数
- 面试题34:丑数
- 丑数——剑指offer面试题34
- 剑指offer——面试题34:丑数
- 剑指Offer面试题34题:丑数(Ugly Number)(while循环里面的三个小问题)