zoukankan      html  css  js  c++  java
  • 33 丑数

    题目描述

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

    丑数只能被2,3,5整除,所以我们一直除以2,一直除以3,一直除以5 ,如果最后等于1就是丑数


    解法1:暴力 超时了 最后。

     1 public class Solution {
     2     public int GetUglyNumber_Solution(int index) {
     3         int ug_cnt=0;
     4         int num =1;
     5         while(ug_cnt<index){
     6             if(isUgly(num)) ug_cnt++;
     7             num++;
     8         }
     9         return num;
    10     }
    11     private boolean isUgly(int num){
    12         while(num %2== 0 )
    13             num/=2;
    14         while(num %3 == 0 )num/=3;
    15         while(num %5== 0 )
    16             num/=5;
    17         return num==1;
    18     }
    19 }

    解法2:

    把前面已经是丑数的数保存起来。



    创建一个数组,数组里面的丑数是排好序的,每一个丑数都是前面的丑数乘以2,3,5得到的。

    对于乘以2,肯定存在某个丑数T2,排在它之前的每一个丑数乘以2得到的结果都会小于已有的最大的丑数,
    排在T2之后的都太大。


    语法问题:

    int t2=0,t3=0,t5 =0;//t2,t3,t5都是下标


    int t2,t3,t5 =0;//错误
    Java不会默认的初始化为0
     1 import java.util.ArrayList;
     2 import java.lang.Math;
     3 public class Solution {
     4     public int GetUglyNumber_Solution(int n) {
     5         if(n<=0) return 0;
     6         ArrayList<Integer> list = new ArrayList<Integer>();
     7         list.add(1);
     8         int t2=0,t3=0,t5 =0;//t2,t3,t5都是下标
     9         while(list.size()<n){
    10             int min = Math.min(list.get(t2)*2,Math.min(list.get(t3)*3,list.get(t5)*5));
    11             list.add(min);
    12             if(min==list.get(t2)*2) t2++;
    13             if(min==list.get(t3)*3) t3++;
    14             if(min==list.get(t5)*5) t5++;
    15         }
    16         return list.get(list.size()-1);
    17     }
    18 }

    c++; 20180725

     1 class Solution {
     2 public:
     3     int GetUglyNumber_Solution(int index) {
     4         if(index<1) return 0;
     5         vector<int> res(index);
     6         int t2=0,t3=0,t5=0;
     7         res[0] = 1;
     8         for(int i =1;i <index;i++){
     9             int m = min(res[t2]*2,min(res[t3]*3,res[t5]*5));
    10             res[i] = m;
    11             if(m==res[t2]*2) t2++;
    12             if(m==res[t3]*3) t3++;
    13             if(m==res[t5]*5) t5++;
    14         }
    15         return res[index-1];
    16     }
    17 };
  • 相关阅读:
    google-glog 开源库分析(一):glog介绍
    homebrew用法
    macos新手入门
    markdown语法_文本效果[转载]
    markdown语法[转载]
    从Search Sort到Join
    实际例子描述和分析“猎豹抢票跨站推荐功能有票刷不到”的疑似bug
    最简单例子图解JVM内存分配和回收
    B树在数据库索引中的应用剖析
    从Count看Oracle执行计划的选择
  • 原文地址:https://www.cnblogs.com/zle1992/p/8157989.html
Copyright © 2011-2022 走看看