您的位置:首页 > Web前端

剑指Offer: (Java实现) 丑数

2017-06-21 09:21 281 查看
* 我们把只包含因子 2,3,和 5 的称为丑数。求按从小到大的顺序的第 1500个丑数。例如 6、8 都是丑数,但 14 不是,因为它包含因子 7.习惯上我们把 1当做第一个丑数 *

该段程序中包含常规方法和最优方法。本篇博客的贡献在于用java实现 剑指offer面试题34:丑数。

相关讲解在此不再赘述(和剑指offer面试题34算法思想相同)。

重点是:应用空间来换取时间,效率提升一万倍。

常规方法:挨个判断每个数是否为丑数。

借助辅助空间的方法:使用数组来保存,快速读取。

public class JZ34_UglyNumber {

public static void main(String[] args) {
long begin = System.currentTimeMillis(); // 这段代码放在程序执行前
//常规方法执行时间超过10秒
//System.out.println(getOneUglyNumber(1500));
//借助辅助空间来提交效率,执行时间1毫秒,效率提升1万倍。
System.out.println(getResult(1500));

long end = System.currentTimeMillis() - begin; // 这段代码放在程序执行后
System.out.println("耗时:" + end + "毫秒");
}
public static boolean isUglyNumber(long num){
if( index < 1){
return 0;
}
while( num % 2 ==0 )
num /= 2;
while( num % 3 ==0 )
num /= 3;
while( num % 5 ==0 )
num /= 5;
return num == 1? true:false;
}
public static long getOneUglyNumber(int index){
long i = 0;
long ci = 0;
while ( ci < index ){
i++;
if( isUglyNumber(i)){
ci++;
}
}
return i;
}
public static long getResult(int index){
if( index < 1){
return 0;
}
long[] array = new long[index];
array[0] = 1;
int nextIndex = 1;
long tar2 = 1;
long tar3 = 1;
long tar5 = 1;
int t2i = 0,t3i=0,t5i=0; //保存上一次最小的比最大值大的丑数的下标,用于下一次寻找丑数时候用,避免了重复的计算与比较
while( nextIndex < index ){
for ( int i = t2i; i<= nextIndex; i++){
if( array[i]*2 > array[nextIndex-1]){
tar2 = array[i]*2;
t2i = i;
break;
}
}
for ( int i = t3i; i<= nextIndex; i++){
if( array[i]*3 > array[nextIndex-1]){
tar3 = array[i]*3;
t3i = i;
break;
}
}
for ( int i = t5i; i<= nextIndex; i++){
if( array[i]*5 > array[nextIndex-1]){
tar5 = array[i]*5;
t5i = i;
break;
}
}
array[nextIndex++] = getMinFromThree(tar2,tar3,tar5);

}
return array[index-1];

}
public static long getMinFromThree(long a,long b,long c){
return Math.min(Math.min(a, b), c);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试题 java 算法