做了个剑指Offer的题目目录,链接如下:
https://blog.csdn.net/mengmengdastyle/article/details/80317246
一、题目
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
二、思路
(1) 丑数
列举: 2 3 4 5 6 8 9 10 12 15 16 18 20 24 25 27 30 32…
可以看出什么规律吗?(能看出个锤子!!!)
(2)
可以看出丑数主要的因子为2,3,5(一句废话,但是怎么体现在操作上呐?这才是关键!)
(3) 第一个丑数为1,我们看第二个丑数产生过程。
2,3,5与第一个丑数1产生关系,即2*1,3*1,5*1比较大小关系?得到最小值为2。及第二个丑数为2。
关键来了:2即和第一个丑数断开关系,指向第二个丑数2;
3和5依然和1建立关系。如图
(4) 接着走,第三个丑数?
比较什么呐?及3*第一个丑数,5*第一个丑数,2*第二个丑数的大小。发现是3,及三个丑数为3。
**关键又来了:**3与第一个丑数断开关系,与第二个丑数建立关系。
(5) 所以懂了吗?
总结一下:
1)每次需要比较的是三个数;所以创建一个比较方法:
private int min(int a, int b) {
return (a > b) ? b : a;
}
用来比较三个数:
min(第一个数, min(第二个数, 第三个数));
进行比较,找到三个数中最小的数;
2) 需要创建三个指针,java里面没有指针,怎么办?
创建三个
int i2 = 0;
int i3 = 0;
int i5 = 0;
即可! 找到谁的关系 +1即可;
3)创建一个数组存放丑数
int[] result = new int[index];
三、代码
public class UglyNumber {
public static void main(String[] args) {
UglyNumber uglyNumber = new UglyNumber();
int index = 20;
System.out.println(uglyNumber.GetUglyNumber_Solution(index));
}
public int GetUglyNumber_Solution(int index) {
if(index <= 0){
return 0;
}
int[] result = new int[index];
result[0] = 1;
int i2 = 0;
int i3 = 0;
int i5 = 0;
int tmp = 0;
int count = 1;
while (count <= index-1) {
tmp = min(result[i2] * 2, min(result[i3] * 3, result[i5] * 5));
if(tmp==result[i2] * 2) i2++;//三条if防止值是一样的,不要改成else的
if(tmp==result[i3] * 3) i3++;
if(tmp==result[i5]*5) i5++;
result[count++]=tmp;
}
return result[index - 1];
}
private int min(int a, int b) {
return (a > b) ? b : a;
}
}