剑指offer系列59---寻找丑数

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

解法一:此解提交运行超时,不推荐。

 1 package com.exe11.offer;
 2
 3 /**
 4  * 【题目】把只包含因子2、3和5的数称作丑数(Ugly Number)。
 5  *             例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
 6  * @author WGS
 7  *
 8  */
 9 //此种方法会出现运行超时的情况、m..........................    .......    .
10 public class GetUglyNumber {
11         public boolean isUglyNumber(int number){
12             while(number%2==0)
13                 number/=2;
14             while(number%3==0)
15                 number/=3;
16             while(number%5==0)
17                 number/=5;
18             return (number==1)?true:false;
19
20         }
21         //返回第n个丑数
22         public int getTheUglyNumber(int n){
23             if(n<=0)
24                 return 0;
25             int count=0;
26             int uglyNum=0;
27             while(uglyNum<n){
28                 ++count;
29                 if(isUglyNumber(count)){
30                     uglyNum++;
31                 }
32
33             }
34             return count;//第n个丑数
35
36         }
37         public static void main(String[] args) {
38             GetUglyNumber g=new GetUglyNumber();
39             int num=g.getTheUglyNumber(1500);
40             System.out.println(num);
41
42         }
43
44
45
46
47 }

解法二:

[思路]上种情况出现运行超时。此种方法是先建立一个数组,因为每个丑数是前几个丑数*2 *3 *5后的结果,所以先将其保存在数组当中,然后在数组中
* 匹配。如果出现相同,就将当前index+1.

package com.exe11.offer;

/**
 * 【题目】把只包含因子2、3和5的数称作丑数(Ugly Number)。
 *             例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
 * [思路]上种情况出现运行超时。此种方法是先建立一个数组,因为每个丑数是前几个丑数*2 *3 *5后的结果,所以先将其保存在数组当中,然后在数组中
 *         匹配。如果出现相同,就将当前index+1.
 * @author WGS
 *
 */
public class GetUglyNumber_Solution2 {

    public int getUglyNumber(int num){
        if(num<=0)
            return 0;
        int[] uglyNumbers=new int[num];
        int nextUglyNumberIndex=1;
        uglyNumbers[0]=1;
        int multiplyNumber2=0;
        int multiplyNumber3=0;
        int multiplyNumber5=0;
        while(nextUglyNumberIndex<num){
            int min=getMin(uglyNumbers[multiplyNumber2]*2,
                           uglyNumbers[multiplyNumber3]*3,
                           uglyNumbers[multiplyNumber5]*5);
            uglyNumbers[nextUglyNumberIndex]=min;//将三者最小的丑数值依次放入数组第1.。。1500个值当中
            nextUglyNumberIndex++;
            if(uglyNumbers[multiplyNumber2]*2==min)//如果当前值刚好是这个丑数,就自增一
                multiplyNumber2++;
            if(uglyNumbers[multiplyNumber3]*3==min)
                multiplyNumber3++;
            if(uglyNumbers[multiplyNumber5]*5==min)
                multiplyNumber5++;

        }
        int uglyNum=uglyNumbers[nextUglyNumberIndex-1];
        return uglyNum;

    }
    private int getMin(int multiplyNumber2, int multiplyNumber3, int multiplyNumber5) {
        int min=(multiplyNumber2<multiplyNumber3)?multiplyNumber2:multiplyNumber3;

        return (min<multiplyNumber5)?min:multiplyNumber5;
    }
    public static void main(String[] args) {
        GetUglyNumber_Solution2 g2=new GetUglyNumber_Solution2();
        int n=g2.getUglyNumber(1500);
        System.out.println(n);

    }

}
时间: 2024-08-29 11:34:10

剑指offer系列59---寻找丑数的相关文章

剑指offer系列源码-丑数

题目1214:丑数 时间限制:1 秒内存限制:32 兆特殊判题:否提交:1700解决:756 题目描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 输入: 输入包括一个整数N(1<=N<=1500). 输出: 可能有多组测试数据,对于每组数据, 输出第N个丑数. 样例输入: 3 样例输出: 3 #include <iostream> #inclu

【剑指offer】q34:丑数

题目要求第n个丑数,所以对于中间结果不需要保存. def Humble(index): curHum = 1 M2 = 2; M3 = 3; M5 = 5 while index > 1: curHum = min(min(M2, M3), M5) while M2 <= curHum: M2 *= 2 while M3 <= curHum: M3 *= 3 while M5 <= curHum: M5 *= 5 index -= 1 return curHum [剑指offer]

【剑指offer】49、丑数

题目 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 思路 显然每个数判断不可取,计算量超级大. 我们要用前面的丑数来生成后面的丑数 从1开始,记三个指针t1,t2,t3,都指向1. 每次将t1,t2,t3所指数字分别乘上2,3,5,取最小的一个生成下一个丑数,并且将对应指针指向新生成的丑数 反复操作即可 (实际代码过程中,使用索引代替指针) class Sol

剑指Offer系列之题11~题15

目录 11.矩形覆盖 12.二进制中1的个数 13. 数值的整数次方 14.调整数组顺序使奇数位于偶数前面 15.链表中倒数第k个结点 11.矩形覆盖 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形.请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 斐波那契数列的应用 第一次竖着放一块类比为走一步,第一次横着放两块类比为走两步 代码与上面的斐波那契数列类题目类似,此处不再赘述:剑指Offer系列之题6~题10. 12.

剑指offer系列47:堆成的二叉树

这个题的主要思路是: 用二叉树的左子树的右子树和右子树的左子树比较,再用左子树的左子树和右子树的右子树比较.(好像有点绕,但其实就是堆成的思想) 剑指offer的说法是用数的前序遍历的两个方法,前序遍历应该是:根->左->右.但是我们用另一种前序遍历:根->右->左.如果这两个序列一样就判断它是对称的. 这两个方法在实现上其实是一样的. 1 class Solution { 2 public: 3 bool isSymmetrical(TreeNode* pRoot) 4 { 5

剑指offer系列10:合并两个排序的链表

我拿到这个题的时候举的例子是链表1:1.3.5.7和链表2:2.4.6.8.我的思路是以:1为基础,将表2的每个结点插入表1.也就是说我一次性是要给新建立的链表中加入两个元素,分别是两个原始链表的头结点.这个思路我做了半天头脑一片混乱,中间指针实在不知道怎么弄了.于是我去睡了一觉,哈哈,我大概是这个世界上最会逃避的人了…… 看了答案使用了递归的方法,其实我做的时候我有想到要用递归,但是没用的原因是我一般写代码不喜欢用递归,原因有两个,一个是递归容易死循环,一个是递归的复杂度太高.但这道题真的太适

剑指offer系列4:斐波那契数列

剑指offer第九题,这个题很古老了.第一个想到的肯定是递归,很简单. 1 #include<iostream> 2 #include<vector> 3 using namespace std; 4 class Solution { 5 public: 6 int Fibonacci(int n) { 7 if (n == 0) 8 { 9 return 0; 10 } 11 if (n==1||n==2) 12 { 13 return 1; 14 } 15 else 16 {

剑指offer系列——48.不用加减乘除做加法

Q:写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号. T: 1.使用进制. 两个数异或:相当于每一位相加,而不考虑进位: 两个数相与,并左移一位:相当于求得进位: 将上述两步的结果相加 首先看十进制是如何做的: 5+7=12,三步走 第一步:相加各位的值,不算进位,得到2. 第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果. 第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12. 同样我们可以用三步走的方

剑指offer系列54---数组中出现次数超过一半的数

[题目]数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. * 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}. * 由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2.如果不存在则输出0. * [思路]首先取第一个数,之后的数与其比较.相同次数+1:不同次数-1.次数=0的时候将第一个数改为次数保存并将次数设置为1. * 这里要考虑到如果出现次数最多的数字没有达到一半的话,就返回0: 1 package com.exe11.offer; 2 3 /**