更改现金功能优化 - Javascript

时间:2018-02-21 20:15:39

标签: javascript function oop object

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

几周前我被要求在测试中解决问题,并且因为我开始学习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
};
}

我认为必须有一个聪明且更优雅的解决方案(可能与mod%或其他东西),但那个怪物是我当时能够拉下来的哈哈哈。

有什么想法吗?

3 个答案:

答案 0 :(得分:1)

这个想法:当金额是奇数时,加上五美元的钞票。然后添加两张美元钞票,直到剩余金额为十的倍数。

&#13;
&#13;
function giveChange(amount) {
    var ch = { two:0, five:0, ten:0 };

    if ( amount < 2 || amount == 3 ) return;

    if ( amount % 2 ) {
        amount -= 5;
        ch.five = 1;
    }   
    
    while ( amount % 10 ) {
        amount -= 2;
        ch.two ++;
    }

    ch.ten = amount/10;

    return ch;
}

console.log(giveChange(12));
console.log(giveChange(27));
console.log(giveChange(33));
&#13;
&#13;
&#13;

如果您使用Math.floor

,也可以跳过while循环

&#13;
&#13;
function giveChange(amount) {
    var ch = { two:0, five:0, ten:0 };

    if ( amount < 2 || amount == 3 ) return;

    if ( amount % 2 ) {
        amount -= 5;
        ch.five ++;
    }
  
    ch.ten = Math.floor(amount/10);

    ch.two = (amount % 10)/2;

    return ch;
}

console.log(giveChange(12));
console.log(giveChange(27));
console.log(giveChange(33));
&#13;
&#13;
&#13;

答案 1 :(得分:0)

编辑:删除了他的初步答案,因为它基于对要求的误解。

好的,那么让我们转过来,首先让我们确定我需要分发多少2美元的账单来获得可以被5美元钞票整除的数字。所以现在我只关心休息时间&lt; 5美元用于计算2美元的账单。

一般的想法是,如果我有change%5为2的值,如12美元或17美元或22美元,......我发出一张2美元的钞票,我可以把其余的除以5。

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

有了这个我有一个静态表格,我需要分发多少2美元的账单,每个change % 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), 
  };
}
  

再次解释一下这是做什么的? “更改&gt;&gt; 1”和“[0,3,1,4,2] [Math.floor(更改)%5];” ?

change >> 1只是Math.floor(change/2)的简写,主要处理特殊情况giveChange(1)giveChange(3);它们不是可互换的,但对于范围0..4(我使用它),它们会产生相同的结果。

let two = [0,3,1,4,2][change % 5];

//does 
let two;
if(change%5 === 0) two = 0;
if(change%5 === 1) two = 3;
if(change%5 === 2) two = 1;
if(change%5 === 3) two = 4;
if(change%5 === 4) two = 2;

并且Math.floor(change) % 5以防万一您将使用浮点数,例如giveChange(25.90)

但也许一个例子可以更好地解释

for(let change=4; change<50; ++change){
  let two = [0,3,1,4,2][change%5];
  console.log("change: %i, two: %i, rest: %i", change, two, change - two*2);
}
.as-console-wrapper{top:0;max-height:100%!important}

您会看到two始终如何始终以相同的顺序拥有相同的5个值,以及其余部分现在如何被5和10整除。

这就是这段代码的作用,它会查找数组[0,3,1,4,2],它需要为任何给定的change使用多少2美元的账单,以便其余的可以被5整除。

答案 2 :(得分:0)

这是我的解决方案,已经过测试并且可以正常工作

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};
}