剑指offer-js 丑数

丑数

题目描述:

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

问题分析:

两种思路:
	1,直接算 -- 这种思路过于繁琐,应该还有其他直接算的简便算法
		   a,从num=2进行遍历
		   b,找出这个数的所有因子
		   c,找出所有因子中的质因子
		   d,判断有无除了2,3,5之外的质因子
		   e,若满足条件,则将该数字放在数组中,后续按照要求从数组中拿出第n个丑数
		   
	2,借助 2 3 5 倍数原理来算
		    倍数* 2 3 5 就是满足条件的数字,
		    关键在于如何从小到达找出所有的这样满足条件的数字
		    那就是对于不同的2 3 5 用不同的指针去乘,每一乘完就找出三个数里面最小的,然后相应的指针++
		    直到找出最后的数字

代码展示:

function GetUglyNumber_Solution(index)
{
    // 倍数* 2 3 5 就是满足条件的数字,
    // 关键在于如何从小到达找出所有的这样满足条件的数字
    // 那就是对于不同的2 3 5 用不同的指针去乘,每一乘完就找出三个数里面最小的,然后相应的指针++
    // 直到找出最后的数字
    if(index<7)
        return index;
    let p2 = 0;
    let p3 = 0;
    let p5 = 0;
    
    var arr = [1];
    let gulyNum;
    while(arr.length<index){
        gulyNum = Math.min(arr[p2]*2,arr[p3]*3,arr[p5]*5);
        if(gulyNum === arr[p2]*2) p2++;
        if(gulyNum === arr[p3]*3) p3++;
        if(gulyNum === arr[p5]*5) p5++;
        arr.push(gulyNum);
    }
    return arr.pop();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值