剑指Offer: (Java实现) 丑数
2017-06-21 09:21
281 查看
* 我们把只包含因子 2,3,和 5 的称为丑数。求按从小到大的顺序的第 1500个丑数。例如 6、8 都是丑数,但 14 不是,因为它包含因子 7.习惯上我们把 1当做第一个丑数 *
该段程序中包含常规方法和最优方法。本篇博客的贡献在于用java实现 剑指offer面试题34:丑数。
相关讲解在此不再赘述(和剑指offer面试题34算法思想相同)。
重点是:应用空间来换取时间,效率提升一万倍。
常规方法:挨个判断每个数是否为丑数。
借助辅助空间的方法:使用数组来保存,快速读取。
该段程序中包含常规方法和最优方法。本篇博客的贡献在于用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); } }
相关文章推荐
- 剑指Offer:面试题34——丑数(java实现)
- 剑指Offer面试题34:丑数 Java实现
- 剑指offer-面试题7:俩个栈实现队列(java)
- 剑指offer--面试题9:斐波那契数列--Java实现
- 剑指offer--面试题20:顺时针打印矩阵--Java实现
- 剑指offer面试题java实现之题4之相关题目:两个排序数组合并
- 剑指offer--面试题25:二叉树中和为某一值的路径--Java实现
- 剑指offer--面试题3:二维数组的查找--Java实现
- 剑指offer--面试题15:链表中倒数第K个结点--Java实现
- 剑指offer--面试题21:包含min函数的栈--Java实现
- 剑指offer--面试题16:翻转链表--Java实现
- 剑指offer面试题java实现之题4:替换空格
- 剑指offer 替换空格 java实现
- 剑指offer--面试题22:栈的压入、弹出序列--Java实现
- 剑指offer题目3-二维数组中的查找(JAVA实现)
- 剑指offer--面试题7:用两个栈实现队列--Java实现
- 剑指offer--面试题12:打印1到最大的n位数--Java实现
- 剑指offer面试题 java实现版 面试题2 实现Singleton模式
- 剑指offer--面试题26:复杂链表的复制--Java实现
- 剑指offer--面试题23:从上往下打印二叉树--Java实现