zoukankan      html  css  js  c++  java
  • 剑指offer之丑数

    题目描述:

    把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
     

    思路一:逐个判断每个整数是不是丑数的解法,直观但不高效(牛客网测试超时)

           所谓一个数m是另一个数n的因子,是指n能被m整数,也就是n%m==0。根据丑数的定义,丑数只能被2、3和5整数。也就是说如果一个数能被2整除,我们就把它连续除以2;如果能被3整数,就连续除以3;如果能被5整除,就除以连续5。如果最后我们得到的数字是1,那么这个数就是丑数,否则不是。该算法非常直观,代码也非常简洁,但 最大的问题是每个整数都需要计算。即使一个数字不是丑数,我们还是需要对它做求余和除法操作 。因此该算法的时间效率不够高,面试官也不会就此满足。
     

    思路二:创建数组保存已找到的丑数,用空间换时间的解法

           前面的算法之所以效率低,很大程度上是因为不管一个数是不是丑数,我们对它都要作计算。接下来我们试着找到一种只要计算丑数的方法,而不在非丑数的整数上浪费时间。
    代码:
     1 public class Solution {
     2     public int GetUglyNumber_Solution(int index) {
     3         if (index == 0) return 0;
     4         int[] res = new int[index];
     5         res[0] = 1;
     6         int i2,i3,i5;
     7         i2 = i3 = i5 = 0;
     8         for (int i = 1;i < index;i ++) {
     9             res[i] = Math.min(res[i2] * 2, Math.min(res[i3] * 3, res[i5] * 5));
    10             if (res[i] == res[i2] * 2) i2 ++;
    11             if (res[i] == res[i3] * 3) i3 ++;
    12             if (res[i] == res[i5] * 5) i5 ++;
    13         }
    14         return res[index - 1];
    15     }
    16 }
     
  • 相关阅读:
    千万级规模高性能、高并发的网络架构经验分享
    CPU高问题排查
    Worker+MQ解惑
    HashMap解惑
    配置时间同步时,遇到同步无法成功的解决方法
    Django基础—— 1.WEB框架介绍
    html5兼容性问题
    jQuery基础——节点操作
    jQuery基础——基本操作
    jQuery基础——选择器
  • 原文地址:https://www.cnblogs.com/maohaitao/p/11456034.html
Copyright © 2011-2022 走看看