本题为剑指offer面试题34
牛客网链接:https://www.nowcoder.com/questionTerminal/6aa9e04fc3794f68acf8778237ba065b
- 时间限制:1秒空间限制:32768K
把只包含素因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
Java代码:
package go.jacob.day509;
/**
* @author Administrator 丑数定义:如果p是丑数,那么p=2^x * 3^y * 5^z
* 那么只要赋予x,y,z不同的值就能得到不同的丑数。
*/
public class Demo1 {
public int GetUglyNumber_Solution(int index) {
if (index <= 0)
return 0;
int[] uglyNumbers = new int[index];
int nextUglyIndex = 1;
uglyNumbers[0] = 1;
// 分别记录乘以2,3,5的下标
int multiply2Index = 0, multiply3Index = 0, multiply5Index = 0;
while (nextUglyIndex < index) {
int min = min_3(uglyNumbers[multiply2Index] * 2, uglyNumbers[multiply3Index] * 3,
uglyNumbers[multiply5Index] * 5);
uglyNumbers[nextUglyIndex++] = min;
if (uglyNumbers[multiply2Index] * 2 == min)
multiply2Index++;
if (uglyNumbers[multiply3Index] * 3 == min)
multiply3Index++;
if (uglyNumbers[multiply5Index] * 5 == min)
multiply5Index++;
}
for (int i = 0; i < index; i++)
System.out.println(uglyNumbers[i]);
return uglyNumbers[index - 1];
}
// 返回最小的数
private int min_3(int a, int b, int c) {
int min = a < b ? a : b;
min = min < c ? min : c;
return min;
}
}