剑指Offer——丑数

举报
SHQ1874009 发表于 2020/12/29 23:16:31 2020/12/29
【摘要】 剑指Offer——丑数 前言     参照《剑指Offer》,通过洞悉其思想并消化吸收,改为java实现,供自己以后巩固。   package cn.edu.ujn.offersword; import java.util.Scanner; public class C5_34_UglyNumber { /...

剑指Offer——丑数

前言

    参照《剑指Offer》,通过洞悉其思想并消化吸收,改为java实现,供自己以后巩固。

 


  
  1. package cn.edu.ujn.offersword;
  2. import java.util.Scanner;
  3. public class C5_34_UglyNumber {
  4. /**
  5. * @date 2016-09-16
  6. * @number 01
  7. * @author SHQ
  8. * 丑数
  9. * 题目描述
  10. *把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
  11. * 思路
  12. *空间换时间
  13. *根据丑数的定义,丑数应该是另一个丑数乘以2,3,或5所得(1除外)。故非丑数不在计算范围之内。额外创建一个数组,用于存放已确定的丑数。
  14. *通过设置3个变量,用于标记第一个大于最大丑数的位置,并将3个变量中的最小丑数作为下一个丑数。 同时避免重复计算。
  15. * 空间复杂度O(n);
  16. */
  17. public static void main(String[] args) {
  18. Scanner in = new Scanner(System.in);
  19. while(in.hasNextInt()){
  20. int index = in.nextInt();
  21. System.out.println(GetUglyNumber_Solution2(index));
  22. }
  23. }
  24. // 超时
  25. private static int GetUglyNumber_Solution(int index) {
  26. if(index <= 0){
  27. return 0;
  28. }
  29. int cnt = 0;
  30. int number = 1;
  31. while(cnt < index){
  32. if(isUgly(number)){
  33. cnt++;
  34. }
  35. number++;
  36. }
  37. return number;
  38. }
  39. private static boolean isUgly(int num){
  40. while(num % 2 == 0)
  41. num /= 2;
  42. while(num % 3 == 0)
  43. num /= 3;
  44. while(num % 5 == 0)
  45. num /= 5;
  46. return num == 1 ? true : false;
  47. }
  48. private static int GetUglyNumber_Solution2(int index) {
  49. if(index <= 0){
  50. return 0;
  51. }
  52. int [] arr = new int [index];
  53. arr[0] = 1;
  54. int index2 = 0, index3 = 0, index5 = 0, nextIndex = 1;
  55. while(nextIndex < index){
  56. System.out.print(arr[nextIndex-1] + " ");
  57. int min = min(arr[index2]*2, arr[index3]*3, arr[index5]*5);
  58. arr[nextIndex] = min;
  59. while(arr[index2] * 2 <= arr[nextIndex])
  60. index2++;
  61. while(arr[index3] * 3 <= arr[nextIndex])
  62. index3++;
  63. while(arr[index5] * 5 <= arr[nextIndex])
  64. index5++;
  65. nextIndex++;
  66. }
  67. return arr[nextIndex-1];
  68. }
  69. private static int min(int a, int b, int c){
  70. int min = (a > b) ? b : a;
  71. return min > c ? c : min;
  72. }
  73. }

美文美图

 

 

文章来源: shq5785.blog.csdn.net,作者:No Silver Bullet,版权归原作者所有,如需转载,请联系作者。

原文链接:shq5785.blog.csdn.net/article/details/52556919

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。