Pla*_*lus 2 javascript oop function 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
};
}
Run Code Online (Sandbox Code Playgroud)
我认为必须有一个更聪明、更优雅的解决方案(可能使用 mod% 或其他东西),但那个怪物是我当时能够实现的哈哈哈。
有什么想法吗?
编辑:删除了他最初的答案,因为它是基于对要求的误解。
好的,那么让我们反过来,首先让我们确定我需要分发多少张 2 美元的钞票才能得到一个可以被 5 美元钞票整除的数字。所以现在我只关心剩下的 < 5 美元来计算 2 美元的钞票。
一般的想法是,如果我有一个值为change%52的值,比如 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),
};
}
Run Code Online (Sandbox Code Playgroud)
再次解释一下这是做什么的?"change>>1" 和 "[0,3,1,4,2][Math.floor(change) % 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;
Run Code Online (Sandbox Code Playgroud)
而Math.floor(change) % 5为以防万一,你会用浮漂使用,像giveChange(25.90)
但也许一个例子可以更好地解释它
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),
};
}
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
您会看到two始终具有相同顺序的相同 5 个值,以及现在其余的值如何被 5 或 10 整除。
这就是这段代码的作用,它查找 Array [0,3,1,4,2],它需要为任何给定的 2 美元钞票使用多少change,以便其余的可以被 5 整除。