您的位置:首页 > Web前端

剑指offer-丑数-Java

2018-03-21 09:06 302 查看
题目描述:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
思路解析:
首先,丑数的定义要明确,只能被2、3、5整除;
其次,两种方法:基本方法是挨个去检查是不是只能够被2、3、5整除,一条道走到黑,剩下的数字是1就是丑数,否则不是;另一种方法是,丑数的2倍、3倍、5倍还是丑数,只要确定从小到大的顺序就可以了。
优化方法详解:初始化数组uglyNumber[0]=1;
然后从{uglyNumber[0]*2、uglyNumber[0]*3、uglyNumber[0]*5}中去找最小的数作为下一个丑数,显然是2,uglyNumber[1]=2;
接着{uglyNumber[1]*2、uglyNumber[0]*3、uglyNumber[0]*5}去找下一个丑数,uglyNumber[2]=3;
接着{uglyNumber[1]*2、uglyNumber[1]*3、uglyNumber[0]*5}去找下一个丑数,uglyNumber[3]=4;......
注意下标的变化可以再去声明三个变量分别控制×2、×3、×5的下标。
代码:public class Solution {
public int GetUglyNumber_Solution(int index) {
if(index<=0){
return 0;
}
int[] uglyNumbers = new int[index];
uglyNumbers[0]=1;
int nextUglyIndex = 1;
int p2=0;
int p3=0;
int p5=0;
while (nextUglyIndex<index){
int min = min(uglyNumbers[p2]*2,uglyNumbers[p3]*3,uglyNumbers[p5]*5);
uglyNumbers[nextUglyIndex]=min;
while(uglyNumbers[p2]*2<=uglyNumbers[nextUglyIndex])
p2++;
while(uglyNumbers[p3]*3<=uglyNumbers[nextUglyIndex])
p3++;
while(uglyNumbers[p5]*5<=uglyNumbers[nextUglyIndex])
p5++;
nextUglyIndex++;
}
return uglyNumbers[--nextUglyIndex];
}
private static int min(int a,int b,int c){
int min=a>b?b:a;
return min = min>c?c:min;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: