前端笔试题记录三

给你随机数量硬币arr,再给你一个随机正整数x,请写出一个函数,算出最少多少枚硬币便可凑成那个正整数,如果能凑成那个数,请返回最少所需的硬币数量,如不能,返回-1

描述的有些不太清楚,示例就是  假如硬币为 【1、2、2、5、5、1】,随机数x为11,那么,最少只需要5、5、1这三个硬币便可得到11这个值,所以返回3

var arr = [1, 2, 2, 5, 1],//硬币数组
    total = 12,//随机数x
    n = 0;//题目最后需要返回的值

function coins(arr, total) {
    var newArr = arr.sort((a, b) => b - a).filter(item => item < total);
    for (let i = 0; i < newArr.length; i++) {
        total -= arr[i];
        n++;
        if (total == 0) {
            return n;
        }
        if (total < 0) {
            total += newArr[i];
            n--;
        }
    }
    if (total != 0) return -1;
}
console.log(coins(arr, total));

我的解题思路:

先对硬币数组进行降序排序,再筛选掉那些比随机数x大的元素(这个貌似不难理解吧,,,假如提供的随机数x是4,硬币数组里有5这个值,不管怎么说,5也不可能凑成4吧

为什么要进行降序排序,很简单啊
这是求最少数量凑成随机数x,那么,我用这个随机数x减去筛选后的硬币数组里最大的值,(因为已经筛选过了,所以剩下的值不管怎么说都不可能超过x,最多相等)

然后就是循环遍历的事了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值