剑指Offer:JZ33 - 丑数(解题思路+Java代码)

JZ33 - 丑数

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

解题思路:就是按顺序找出下一个丑数,从第一个数一次乘2、3、5找到最小的就是下一个丑数,同时对应的2、3、5下标+1;直到找到第index个丑数。

丑数arr序列:1 2 3 4 5 6 8 9 10 12 15 16 18 20…

定义:乘2对应的下标:int2;乘3对应的下标:int3;乘5对应的下标:int5;

从2开始进行(arr[int2] * 2、arr[int3] * 3、arr[int5] * 5)找最小值

丑数2:(1*2、1*3、1*5)最小值为1*2,同时int2所指的下标+1;当前int2指向2

丑数3:(2*2、1*3、1*5)最小值为1*3,同时int3所指的下标+1;当前int3指向2

丑数4:(2*2、2*3、1*5)最小值为2*2,同时int2所指的下标+1;当前int2指向3

丑数5:(3*2、2*3、1*5)最小值为1*5,同时int5所指的下标+1;当前int5指向2

丑数6:(3*2、2*3、2*5)最小值为3*2和2*3,同时int2和int3所指的下标+1;当前int2指向4,int3指向3

/**
 * @author 枫叶火火
 */
public class Solution {
	static int GetUglyNumber_Solution(int index){
	    if(index <= 0){
	        return 0;
	    }
	    //创建一个保存丑数的数组
	    int[] arr = new int[index];
	    //设置第一个丑数为1
	    arr[0] = 1;
	    //下一个乘2或3或5的数组下标值
	    int int2 = 0;
	    int int3 = 0;
	    int int5 = 0;
	    //逐个进行保存直到保存到第index个数
	    for(int i = 1 ; i < index ; i++){
	        //找出当前的最小丑数
	        arr[i] = Math.min(arr[int2]*2,Math.min(arr[int3]*3,arr[int5]*5));
	        //判断乘多少等于当前丑数,就把对应相乘的下标值加一
	        //注意:这里判断不能用if+else 这样会存在重复数字(2*3 和 3*2)所以在等于arr[i]==6时,要把int2和int3都+1
	        if(arr[i] == arr[int2]*2){
	            int2++;
	        }
	        if(arr[i] == arr[int3]*3){
	            int3++;
	        }
	        if(arr[i] == arr[int5]*5){
	            int5++;
	        }
	    }
	    return arr[index-1];
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值