《剑指offer第二版》面试题49:丑数(Ugly Number)(java)

题目描述

  • 题目描述:我们把只包含2,3,5的数称为丑数(ugly number),求从小到大的顺序的第1500个丑数。例如6,8是丑数,但14不是,因为它包含因子7。习惯上我们把1称为第一个丑数。

解题思路

  1. 根据丑数的定义,丑数应该是丑数乘以2、3或者5的结果。
  2. 可以创建一个数组A,数组里的数字是排好序的丑数。
  3. 假设数组里最大的丑数是M,则接下的一个丑数则是之前的某个丑数乘以2、3或者5的结果。
  4. 记录三个下标,K2,K3,K5,其中 A[K2]* 2刚好大于M, A[K3]* 3刚好大于M, A[K5]* 5也刚好大于M。
  5. 则接下来的丑数是A[K2]* 2 、 A[K3]* 3 和 A[K5]* 5的最小值。同时更新K2,K3,K5的值。

代码

int getUglyNumber(int index){
    if (index <= 0) {
        return 0;
    }
    int[] uglys = new int[index];
    // 第一个丑数是1
    uglys[0] = 1;
    // 记录下一个丑数在数组里的下标
    int nextUglyIndex = 1;

    int uglyIndexMulti2 = 0;
    int uglyIndexMulti3 = 0;
    int uglyIndexMulti5 = 0;

    while (nextUglyIndex < index) {
        uglys[nextUglyIndex] = min(uglys[uglyIndexMulti2] * 2,
                                    uglys[uglyIndexMulti3] * 3,
                                    uglys[uglyIndexMulti5] * 5);
        while (uglys[uglyIndexMulti2] * 2 <= uglys[nextUglyIndex]) {
            uglyIndexMulti2++;
        }
        while (uglys[uglyIndexMulti3] * 3 <= uglys[nextUglyIndex]) {
            uglyIndexMulti3++;
        }
        while (uglys[uglyIndexMulti5] * 5 <= uglys[nextUglyIndex]) {
            uglyIndexMulti5++;
        }
        nextUglyIndex ++;
    }
    return uglys[index - 1];
}

int min(int a, int b, int c) {
    return Math.min(Math.min(a,b),c);
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目描述 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包...
    Mereder阅读 312评论 0 0
  • 题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。习惯...
    qmss阅读 1,274评论 0 0
  • 题目:把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质...
    孙强Jimmy阅读 568评论 0 0
  • 有时候,你选择与某人保持距离,不是因为不在乎,而是因为你清楚的知道,ta不属于你。 人生遇到的每个人,出场顺序真的...
    西双阅读 236评论 0 0
  • (邹鑫《小强升职记》读书笔记1) 人分为两类:确实很忙的人和假装很忙的人。你呢,属于哪一类?我们从小被教育,...
    嘀嗒姐姐阅读 866评论 0 2