更改现金功能优化-Javascript

更改现金功能优化-Javascript,javascript,function,oop,object,Javascript,Function,Oop,Object,今天我来帮助您优化一些代码 几周前,我在一次测试中被要求解决一个问题,并提出了这个非最优的解决方案,因为我在乞求学习Javascript 我想知道是否有办法(当然有办法)让它变得更好 情况如下: “我是一个特别善良的人,有无限数量的2美元、5美元和10美元钞票,我愿意为任何想要的人兑换现金,但以最有效的方式,以最少的钞票。” 由于我必须返回一个包含账单数量的对象(如果少于2美元,则返回null),因此我给出了以下解决方案: function giveChange(change){ var

今天我来帮助您优化一些代码

几周前,我在一次测试中被要求解决一个问题,并提出了这个非最优的解决方案,因为我在乞求学习Javascript

我想知道是否有办法(当然有办法)让它变得更好

情况如下:

“我是一个特别善良的人,有无限数量的2美元、5美元和10美元钞票,我愿意为任何想要的人兑换现金,但以最有效的方式,以最少的钞票。”

由于我必须返回一个包含账单数量的对象(如果少于2美元,则返回null),因此我给出了以下解决方案:

function giveChange(change){    
var two = 0;
var five = 0;
var ten = 0;
var changeToGo = change;

while(changeToGo >= 11){
    changeToGo -=10;
    ten+=1;
}

while(changeToGo >=7 && changeToGo <=11){
    changeToGo-=5;
    five+=1;
}

while(changeToGo >=2 && changeToGo <=6 ){
    if(changeToGo == 5){
        changeToGo -=5;
        five+=1;
}
    else{
        changeToGo -= 2;
        two+=1;
    }
}

if (change < 2){
    return null;
}

return {
    two: two,
    five: five,
    ten: ten
};
}
函数给定更改(更改){
Var2=0;
var五=0;
var-ten=0;
var changeToGo=变化;
while(changeToGo>=11){
changeToGo-=10;
十+=1;
}

当(changeToGo>=7&&changeToGo=2&&changeToGo时,您可以采用组合算法并返回数组中的分母

函数组合(数组、和){
函数c(左、右、和){
如果(!sum){
结果=正确;
返回true;
}
返回左。一些(函数(a,i,aa){
返回一个sum-a),对。concat(a),sum-a);
});
}
var结果=[];
c(array.sort(函数(a,b){return b-a;}),[],sum);
返回结果;
}
职能变更(变更){
返回联合收割机([10,5,2],更改);
}
console.log(giveChange(7));
console.log(giveChange(13));

console.log(giveChange(23));
创意:当金额为奇数时,添加一张5美元的钞票。然后添加两张美元钞票,直到剩余金额为10的倍数

功能更改(金额){
var ch={2:0,5:0,10:0};
如果(金额<2 | |金额==3)返回;
如果(金额%2){
金额-=5;
第五章=1;
}   
而(金额%10){
金额-=2;
ch.two++;
}
第十章=金额/10;
返回ch;
}
console.log(giveChange(12));
console.log(giveChange(27));
log(giveChange(33));
编辑:删除了最初的答案,因为这是基于对需求的误解

好的,那么让我们把它转过来,首先让我们确定我需要分发多少张2美元的钞票才能得到一个可以被5美元钞票整除的数字。所以现在我只关心剩余的<5美元的钞票来计算2美元的钞票

一般的想法是,如果我有一个值,其中
change%5
是2,比如12美元、17美元或22美元,…我分发一张2美元的钞票,其余的可以除以5

对于14美元,19美元,这是两张2美元的钞票,对于11美元,16美元,我减去6美元,对于13美元,18美元,这是8美元

有了它,我就有了一个静态表,其中列出了我必须分发多少2美元的钞票,对于每一次
更改%5
;不需要循环,只需简单的查找即可

function giveChange(change){
  const two = change < 4? change>>1: [0,3,1,4,2][Math.floor(change) % 5],
    rest = change - two*2;

  return { 
    two,
    five: Math.floor((rest%10)/5), 
    ten: Math.floor(rest/10), 
  };
}
Math.floor(change)%5
只是为了防止您将其用于浮动,如
giveChange(25.90)

但也许一个例子能更好地解释这一点


for(让change=4;change这是我的解决方案,经过测试,效果良好

function caisse(cash){
two =0;
five =0;
ten = 0;

if (cash>10){
rendu = cash%10;
ten = Math.floor(cash/10);
}
if (rendu%2===0){
  two = rendu/2
}
  if (rendu%2==1 && rendu>=5)
{
  five = 1
two = (rendu-5)/2; 
}

  else if (rendu%2==1 && rendu<5){
    two=Math.floor(rendu/2);
}
return {"two :": two, "five :": five, "ten : ": ten};
}
功能caisse(现金){
二=0;
五=0;
十=0;
如果(现金>10){
rendu=现金%10;
10=数学下限(现金/10);
}
如果(rendu%2==0){
二=人都/2
}
如果(rendu%2==1&&rendu>=5)
{
五等于一
二=(人都-5)/2;
}


否则,如果(rendu%2==1&&renduSorry,我必须按照记忆中的那样重写该函数,该函数在测试版本中工作,这只是一个输入错误。(现在正在编辑)。大多数开发人员可能会使用模运算符。嗯。最佳(和一般)解决方案与分区有关,这是一个困难的问题。我将在接下来的几天内尝试提供一个优雅的解决方案。我要记住的是,我们可以在这种情况下使用模数吗?另外,我问的是效率,因为在非常大的数量中,我最终使用了大量内存,这在测试中是不允许的,为了解决这个问题,我不得不做了一个非常难看的把戏。虽然我有点迷糊了语法,这是非常有效的,但它并不能解决问题,因为我没有返回正确的更改,在上面的情况下,当我们试图返回13美元或23美元时,我们最终在过程中损失了1美元。返回13美元的最有效和正确的方法是[0,1,4]还有,我必须在一个对象中返回这些值,有两个、五个、十个属性。确实有效。如果我理解得很好,你可以构建所有可能的组合,给出正确的数量,然后对它们进行排序,选择最短的?优点是你可以将其用于任何一组账单。这非常聪明,但我必须承认我真的很聪明丢失。使用floor方法,我们最终遇到了一个问题,我们抢走了客户的$1。@Platiplus是的,但是值<$2不是被忽略了吗?如果您试图单独更改$1,它们会被忽略,因为这是不可能的,但是如果您可以通过更改其他账单来实现结果,它们就不能被忽略。@Platiplus添加了第二个代码,该代码将没有循环之类的。再加上解释都德,这太疯狂了!想再解释一下吗?“更改>>1”和“[0,3,1,4,2][Math.floor(更改)%5];”?记住我在这方面是一个真正的初学者。就是这样,我对大量的数据进行了测试,结果很顺利,非常准确!!!我想这是最简单的,对吧?@Platiplus:我也这么认为。注意while循环最多可以转4圈。是的,我的要求更像是以更少的行数的方式。但该死,这正是我所需要的当时。@Platiplus:你甚至不需要这个while循环,请看我的编辑。不知道为什么会被否决。你的代码工作得很好,是codingame.com JavaScript评估中一个问题的答案。干杯!
function caisse(cash){
two =0;
five =0;
ten = 0;

if (cash>10){
rendu = cash%10;
ten = Math.floor(cash/10);
}
if (rendu%2===0){
  two = rendu/2
}
  if (rendu%2==1 && rendu>=5)
{
  five = 1
two = (rendu-5)/2; 
}

  else if (rendu%2==1 && rendu<5){
    two=Math.floor(rendu/2);
}
return {"two :": two, "five :": five, "ten : ": ten};
}