剑指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;
}
}
思路解析:
首先,丑数的定义要明确,只能被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;
}
}
相关文章推荐
- 剑指Offer 34题 丑数 Java版
- 剑指offer-丑数(Java)
- 剑指offer:丑数(java)
- 剑指Offer: (Java实现) 丑数
- 剑指Offer(java版):丑数
- 【剑指offer-Java版】34丑数
- 剑指Offer:面试题34——丑数(java实现)
- 剑指Offer面试题34(Java版):丑数
- 剑指Offer面试题34:丑数 Java实现
- 剑指offer面试题5(java实现)
- 剑指offer:二叉搜索树与双向链表(java)
- 剑指Offer 40题扩展 其他数字出现3次 找出只出现一次的那个 Java实现
- 【剑指offer-Java版】42翻转单词顺序VS左旋转字符串
- 剑指Offer面试题32:从1到n整数中1出现的次数 Java实现
- 剑指offer-正则表达式匹配-java
- 剑指offer-数组中的逆序对-Java
- 剑指offer编程题Java实现——面试题12相关题大数的加法、减法、乘法问题的实现
- [遇见时光]剑指offer-顺时针打印矩阵java
- 剑指offer:数组中只出现一次的数字(java)
- [置顶] 【剑指offer】Java实现代码汇总