今天我来帮助您优化一些代码!
几周前我被要求在测试中解决问题,并且因为我开始学习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%或其他东西),但那个怪物是我当时能够拉下来的哈哈哈。
有什么想法吗?
答案 0 :(得分:1)
这个想法:当金额是奇数时,加上五美元的钞票。然后添加两张美元钞票,直到剩余金额为十的倍数。
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;
如果您使用Math.floor
:
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;
答案 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};
}