丑数,真丑!
一个数的因子仅仅包括2,3,5的数称为丑数。
public class uglyNumber {
//判断一个数是否为丑数
public boolean isUglyNumber(int number){
while (number%2==0){
number = number/2;
}
while (number%3==0){
number = number/3;
}
while (number%5==0){
number = number/5;
}
return number==1;
}
//寻找第N个丑数
//从前往后查找,需要使用前面的元素确定放后面的元素。
//设置三个指针,分别指向对应索引的位置,取大于元素最小的那一个,作为下一个丑数。
public int FindUglyNumber(int index){
int uglyNumber[] = new int[index];
uglyNumber[0] = 1;
int uglyIndex = 1;
int p2 = 0;
int p3 = 0;
int p5 = 0;
while (uglyIndex<index){
//新的最小值为,原来p2,p3,p5,对应位置乘2,3,5得到。
//之后赋值给那个位置。
//之后寻找下一个位置的三个指针。
int min = min(uglyNumber[p2]*2,uglyNumber[p3]*3,uglyNumber[p5]*5);
uglyNumber[uglyIndex] = min;
while (uglyNumber[p2]*2<=uglyNumber[uglyIndex]){
p2++;
}
while (uglyNumber[p3]*3<=uglyNumber[uglyIndex]){
p3++;
}
while (uglyNumber[p5]*5<=uglyNumber[uglyIndex]){
p5++;
}
uglyIndex++;
}
return uglyNumber[index-1];
}
//选择a,b,c中最小的一个
public int min(int a,int b,int c){
if(a<b&&a<c) {
return a;
}
if(b<a&&b<c){
return b;
}
return c;
}
}
总结:1,首先要理解丑数的概念。
2,查找第N个丑数时,会开辟N个空间,但是这样做能够省时间。