Exact Change FreeCodeCamp
function checkCashRegister(price, cash, cid) {
var change;
var sumCid = 0; // Here is your change, ma'am. //找零(change),付款(cash),购买价格(price),收银机中零钱(cid)
change = cash - price; //计算零钱总额
for (var i = 0; i < cid.length; i++) {
sumCid += cid[i][1];
}
return sumCid;
sumCid = Number(sumCid.toFixed(2)); //保留两位小数 if (sumCid < change) {
return "Insufficient Funds"; //余额不足
} else if (sumCid === change) {
return "Closed";
} else {
// 1.零钱不够,返回余额不足
// 2.零钱足够,找回零钱
return overChange(change, cid, sumCid);
}
} function overChange(change, arr, sumCid) {
var array = [];
var len = arr.length; for (var i = len - 1; i >= 0; i--) {
if (arr[i][1] === 0) continue; if (arr[i][1] < change) {
array.push(arr[i]);
change -= arr[i][1];
change = Number(change.toFixed(2));
} else if (arr[i][1] > change) {
var x = arr[i][0]; // 取得零钱名称
var y = 0; switch(x) {
case "ONE HUNDRED":
y = Math.floor(change / 100) * 100;
break;
case "TWENTY":
y = Math.floor(change / 20) * 20;
break;
case "TEN":
y = Math.floor(change / 10) * 10;
break;
case "FIVE":
y = Math.floor(change / 5) * 5;
break;
case "ONE":
y = Math.floor(change / 1);
break;
case "QUARTER":
y = Math.floor(change / 0.25) * 0.25;
break;
case "DIME":
y = Math.floor(change / 0.10) * 0.10;
break;
case "NICKEL":
y = Math.floor(change / 0.05) * 0.05;
break;
case "PENNY":
y = Math.floor(change / 0.01) * 0.01;
break;
} if (y === 0 && sumCid - arr[i][1] < change) {
return "Insufficient Funds";
} else if (y === 0) {
continue;
} else {
if (y < 1) {
y = y;
}
var array1 = [];
array1.push(arr[i][0]);
array1.push(y);
array.push(array1);
change -= y;
change = Number(change.toFixed(2));
}
}
} if (change === 0) {
return array;
} else {
return "Insufficient Funds";
} }
题目:
设计一个收银程序 checkCashRegister()
,其把购买价格(price
)作为第一个参数 , 付款金额 (cash
)作为第二个参数, 和收银机中零钱 (cid
) 作为第三个参数.
cid
是一个二维数组,存着当前可用的找零.
当收银机中的钱不够找零时返回字符串 "Insufficient Funds"
. 如果正好则返回字符串 "Closed"
.
否则, 返回应找回的零钱列表,且由大到小存在二维数组中.
分析:
一个模拟找钱的程序。思路应该是这样的:
首先,分析函数的参数,第一个参数是商品价格price,第二参数是支付现金金额cash,第三个是柜员机当前的零钱cid,是一个二维数组,它已经将所拥有的相同面值的钱币做了一个累加,比如面值为5元的就剩35元了这样。
然后我们来分析函数的实现逻辑,结账时,会先扫描一下商品的价格,做一个累加,得到总的支付金额比如说78元,然后你给的钱是现金的话是不是要给50+20+5+1*3或者10*7+1*8等等等的组合。
//找零(change),付款(cash),购买价格(price),收银机中零钱(cid)
change = cash - price;
但是你刚好没有零钱,最小100,你只能给100。那么此时基于交易等价交换的原则,柜员机得找零对吧,而且得找得回这么多零钱对吧,找不回就返回字符串"Insufficient Funds",表示零钱不足,交易基于等价交换的原则无法进行。那么你要先求找零的金额大小,然后与柜员机当前的零钱总额作比较。找零的金额为 cash - price,当前柜员机的零钱总额为各个面值大小的纸币的金额总额相加。数组是规律的,第一项是钱币面值,第二项是该面值的钱币总额。所以可以循环遍历叠加金额。
//计算零钱总额
for (var i = 0; i < cid.length; i++) {
sumCid += cid[i][1];
}
当可以找零的时候,你会拿钱,而且是一个面值的纸币一个面值的纸币的拿吧,不会找27元你找个27个一元钱吧。最简便的做法总是先给一张较大的但小于当前需要找零的零钱的纸币。这是使用循环变量递减的原因。
for (var i = len - 1; i >= 0; i--) {
你没找零多少钱需要找得零钱总额在减小
change -= y;
还有一种情况就是,有可能柜员机零钱总额足够找零,但是找不开,比如说要找零3元,但你最小的纸币只剩下5元了,这时也是需要返回字符串"Insufficient Funds",表示零钱不足,交易基于等价交换的原则无法进行。
if (y === 0 && sumCid - arr[i][1] < change) {
return "Insufficient Funds";
}
if (change === 0) {
return array;
} else {
return "Insufficient Funds";
}
change == 0 是判断能否成功找零的直接标准。
如果循环结束了,change != 0,说明现在的零钱找不开。否则返回需要找回的零钱。
方法参考文档
Number.prototype.toFixed()
toFixed()
方法使用定点表示法来格式化一个数。
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Number/toFixed
Exact Change FreeCodeCamp的更多相关文章
- Exact Change(背包HDU2753)
Exact Change Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- FCC高级编程篇之Exact Change
Exact Change Design a cash register drawer function checkCashRegister() that accepts purchase price ...
- Exact Change(01背包)
描述 Seller: That will be fourteen dollars. Buyer: Here's a twenty. Seller: Sorry, I don't have any ch ...
- Exact Change
设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) 作为第三个参数. cid ...
- [Advanced Algorithm] - Exact Change
题目 设计一个收银程序 checkCashRegister(),其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) 作为第三个参数. ci ...
- UVA-11517 Exact Change(DP)
题目大意:有n张钞票,面值可能不同.你要买一件东西,可能需要找零钱.问最少付多少钱,并求出最少的钞票张数. 题目分析:定义状态dp(i,w)表示前i张钞票凑成w元需要的最少钞票张数.则状态转移方程为d ...
- FCC(ES6写法) Exact Change
设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) 作为第三个参数. cid ...
- FreeCodeCamp 高级算法(个人向)
freecodecamp 高级算法地址戳这里. freecodecamp的初级和中级算法,基本给个思路就能完成,而高级算法稍微麻烦了一点,所以我会把自己的解答思路写清楚,如果有错误或者更好的解法,欢迎 ...
- Codeforces Round #598 (Div. 3) A. Payment Without Change 水题
A. Payment Without Change You have a coins of value n and b coins of value 1. You always pay in exac ...
随机推荐
- python项目开发:学员管理系统
学员管理系统 #需求: 1.用户角色:讲师/学员,登陆后根据角色不同能做的事情不同 2.讲师视图 - 管理班级,可创建班级,根据学员qq号把学员加入班级 - 可创建指定班级的上课纪录,注意一节上课纪录 ...
- 一维数组快速转集合(List)
String[] arr={"qwe","asd","zxc","asddf","hghgf"}; ...
- poj 3041 最小点覆盖=最大匹配
#include<stdio.h> #include<string.h> #define N 510 int map[N][N],n,mark[N],link[N]; in ...
- spring boot @Transactional事物处理
spring boot 添加事物使用 @Transactional注解 简单使用 在启动类上方添加 @EnableTransactionManagement注解 使用时直接在类或者方法上使用 @Tra ...
- Linux文件查找命令find(转)
Linux find命令用来在指定目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名.如果使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目录与文件.并且将查找到的子目录 ...
- 关于JOS 未对全部内存分页映射之前 物理地址映射问题的思考
在kern/pmap.c 里面会又以下这段代码,要知道boot_alloc只会分配线性地址,真正建立虚拟页和物理页映射关系的在后面的page_alloc. ////////////////////// ...
- Hibernate 自定义方言
自定义一个方言类——Hibernate Dialect 标签: hibernatesqlserverjdbcmysql数据库java 2012-07-04 18:46 2847人阅读 评论(1) 收藏 ...
- BZOJ3172 单词 Fail树
题目大意:求一篇论文中每个单词分别在论文中出现多少次. 本题用AC自动机太慢,应该用Fail树将AC自动机中所有的Fail指针反向得到一个新树,这就是Fail树.对长度为x的字符串a和长度为y的字符串 ...
- C++中值传递(pass-by-value)和引用传递(pass-by-reference)
1.pass-by-value的情况: 缺省情况C++以pass-by-value(继承C的方式)传递对象至(或来自)函数.函数参数都是以实际参数的复件为初值,调用端所获得的也是函数返回值的一个复件, ...
- 利用网络Socket和多线程实现一个双向聊天
接收键盘输入然后向对方发送消息的线程 package cn.com.chat; import java.io.BufferedReader; import java.io.BufferedWriter ...