剑指Offer | 丑数

48 篇文章 0 订阅
30 篇文章 0 订阅

做了个剑指Offer的题目目录,链接如下:
https://blog.csdn.net/mengmengdastyle/article/details/80317246
一、题目
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
二、思路
(1) 丑数
列举: 2 3 4 5 6 8 9 10 12 15 16 18 20 24 25 27 30 32…
可以看出什么规律吗?(能看出个锤子!!!)
(2)
可以看出丑数主要的因子为2,3,5(一句废话,但是怎么体现在操作上呐?这才是关键!)
(3) 第一个丑数为1,我们看第二个丑数产生过程。
2,3,5与第一个丑数1产生关系,即2*1,3*1,5*1比较大小关系?得到最小值为2。及第二个丑数为2。
关键来了:2即和第一个丑数断开关系,指向第二个丑数2;
3和5依然和1建立关系。如图
第二个丑数产生
(4) 接着走,第三个丑数?
比较什么呐?及3*第一个丑数,5*第一个丑数,2*第二个丑数的大小。发现是3,及三个丑数为3。
**关键又来了:**3与第一个丑数断开关系,与第二个丑数建立关系。
这里写图片描述
(5) 所以懂了吗?
总结一下:
1)每次需要比较的是三个数;所以创建一个比较方法:

private int min(int a, int b) {
        return (a > b) ? b : a;
    }

用来比较三个数:
min(第一个数, min(第二个数, 第三个数));
进行比较,找到三个数中最小的数;
2) 需要创建三个指针,java里面没有指针,怎么办?
创建三个
int i2 = 0;
int i3 = 0;
int i5 = 0;

即可! 找到谁的关系 +1即可;
3)创建一个数组存放丑数
int[] result = new int[index];

三、代码

public class UglyNumber {
    public static void main(String[] args) {
        UglyNumber uglyNumber = new UglyNumber();
        int index = 20;
        System.out.println(uglyNumber.GetUglyNumber_Solution(index));
    }
    public int GetUglyNumber_Solution(int index) {
        if(index <= 0){
            return 0;
        }
        int[] result = new int[index];
        result[0] = 1;

        int i2 = 0;
        int i3 = 0;
        int i5 = 0;
        int tmp = 0;

        int count = 1;
        while (count <= index-1) {
            tmp = min(result[i2] * 2, min(result[i3] * 3, result[i5] * 5));
            if(tmp==result[i2] * 2) i2++;//三条if防止值是一样的,不要改成else的
            if(tmp==result[i3] * 3) i3++;
            if(tmp==result[i5]*5) i5++;
            result[count++]=tmp;
        }
        return result[index - 1];
    }
    private int min(int a, int b) {
        return (a > b) ? b : a;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值