FCC高级编程篇之Exact Change
Exact Change
Design a cash register drawer function checkCashRegister() that accepts purchase price as the first argument (price), payment as the second argument (cash), and cash-in-drawer (cid) as the third argument.
cid is a 2D array listing available currency.
Return the string "Insufficient Funds" if cash-in-drawer is less than the change due. Return the string "Closed" if cash-in-drawer is equal to the change due.
Otherwise, return change in coin and bills, sorted in highest to lowest order.
考察浮点数运算
本题中小于1美元的部分如果直接运算会产生一定的误差。因此所有数都乘以100,最后输出时再除100。
function checkCashRegister(price, cash, cid) {
const deno = {
'PENNY': 1,
'NICKEL': 5,
'DIME': 10,
'QUARTER': 25,
'ONE': 100,
'FIVE': 500,
'TEN': 1000,
'TWENTY': 2000,
'ONE HUNDRED': 10000
};
let result = [];
return result;
}
checkCashRegister()方法传入了三个参数。
- 第一个参数是价格
- 第二个参数是收到的金额
- 第三个参数
cid是一个数组,表示可用于找零的钱
首先把传入的cid的值都乘以100。
let cidObj = {};
for (let i in cid) {
cidObj[cid[i][0]] = cid[i][1] * 100;
}
找零的钱也要乘以100。
let change = (cash - price) * 100;
收银台需要有小于或等于要找的零钱的钱,为此需要获得各种面额的名称以及钱数。判断收银台的钱是否有比要找的钱小的面值,以及此面额是否有钱。
let keys = Object.keys(deno);
let i = keys.length - 1;
while (i >= 0) {
while (deno[keys[i]] <= change && !!cidObj[keys[i]]) {
change -= deno[keys[i]];
cidObj[keys[i]] -= deno[keys[i]];
}
i--;
}
如果经过上述循环后,change不为零,则说明找不开。
if (!!change) {
return "Insufficient Funds";
}
如果找得开,则判断收银台里是否还有钱。
for (let i in cidObj) {
if (!!cidObj[i]) {
break;
} else if (i === keys[keys.length - 1]) {
return "Closed";
}
}
如果还有钱,则计算收银台在找完钱后还剩多少钱。这里需要有收银台原来的钱数,故在先前cid传入后多拷贝一个。引用类型需进行深拷贝。
let cidObj = {};
let objCopy = {};
for (let i in cid) {
cidObj[cid[i][0]] = cid[i][1] * 100;
objCopy[cid[i][0]] = cid[i][1] * 100;
}
然后判断各种面额的钱数是否有变化。
for (let i in objCopy) {
if (objCopy[i] !== cidObj[i]) {
result.unshift([i, (objCopy[i] - cidObj[i]) / 100]);
}
}
最后输出result即可。完整代码如下。
function checkCashRegister(price, cash, cid) {
const deno = {
'PENNY': 1,
'NICKEL': 5,
'DIME': 10,
'QUARTER': 25,
'ONE': 100,
'FIVE': 500,
'TEN': 1000,
'TWENTY': 2000,
'ONE HUNDRED': 10000
};
let cidObj = {};
let objCopy = {};
let keys = Object.keys(deno);
let i = keys.length - 1;
let change = (cash - price) * 100;
let result = [];
for (let i in cid) {
cidObj[cid[i][0]] = cid[i][1] * 100;
objCopy[cid[i][0]] = cid[i][1] * 100;
}
while (i >= 0) {
while (deno[keys[i]] <= change && !!cidObj[keys[i]]) {
change -= deno[keys[i]];
cidObj[keys[i]] -= deno[keys[i]];
}
i--;
}
if (!!change) {
return "Insufficient Funds";
}
for (let i in cidObj) {
if (!!cidObj[i]) {
break;
} else if (i === keys[keys.length - 1]) {
return "Closed";
}
}
for (let i in objCopy) {
if (objCopy[i] !== cidObj[i]) {
result.unshift([i, (objCopy[i] - cidObj[i]) / 100]);
}
}
return result;
}
运行结果如下图所示。

FCC高级编程篇之Exact Change的更多相关文章
- FCC高级编程篇之Validate US Telephone Numbers
Validate US Telephone Numbers Return true if the passed string is a valid US phone number. The user ...
- FCC高级编程篇之Make a Person
Make a Person Fill in the object constructor with the following methods below: getfirstname() getLas ...
- FCC高级编程篇之Symmetric Difference
Symmetric Difference Create a function that takes two or more arrays and returns an array of the sym ...
- FCC高级编程篇之Record Collection
Record Collection You are given a JSON object representing a part of your musical album collection. ...
- FCC(ES6写法) Exact Change
设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) 作为第三个参数. cid ...
- (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字
. . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...
- unix环境高级编程基础知识之第二篇(3)
看了unix环境高级编程第三章,把代码也都自己敲了一遍,另主要讲解了一些IO函数,read/write/fseek/fcntl:这里主要是c函数,比较容易,看多了就熟悉了.对fcntl函数讲解比较到位 ...
- C++面向对象高级编程(四)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一.Static 二.模板类和模板函数 三.namespace 一.Static 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“ ...
- C++面向对象高级编程(三)基础篇
技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 一.拷贝构造 二.拷贝赋值 三.重写操作符 四.生命周期 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主 ...
随机推荐
- table-layout:fixed属性
说实话,第一次见到这个属性有点懵圈,真是没见过这个属性 好了,直接说作用 table-layout其实是一种表格算法,用来显示表格单元格.行.列的算法规则. 固定表格布局: 固定表格布局与自动表格布局 ...
- X Macro
30年前我念大学时从一个朋友那里学来的一个技巧. 它是汇编语言的一个宏,但很容易转换为C语言宏. 我一直在使用它,但有意思的是我还从没在别人的代码中看到过.现在该我把这个小技巧传递下去了. 让我们举个 ...
- Sphinx全文索引安装教程
首先了解一下sphinx全文索引的相关知识官方网站:http://www.sphinxsearch.com/ 官方文档:http://www.sphinxsearch.com/docs/ 中文支持:h ...
- windows下Keras框架搭建
1. 安装Anaconda https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ conda info来查询安装信息 conda list可以查 ...
- swift使用查阅资料备份2
Swift3.0朝圣之路-Then协议库-绝妙的初始化方式 https://www.jianshu.com/p/6cc1e21df6ac DisposeBag http://southpeak.git ...
- Jmeter--Timer设置等待时间
一.Jmeter定时器的概念:1)定时器是在每个sampler(采样器)之前执行的,而不是之后:是的,你没有看错,不管这个定时器的位置放在sampler之后,还是之下,它都在sampler之前得到执行 ...
- 【XSY2692】杨柳 - 网络流
题目来源:2018冬令营模拟测试赛(十) 题解: 继续鬼畜网络流…… 首先这题有个显然的做法:bfs预处理出每个起点到每个终点的最短步数,然后直接建边加超级源汇跑费用流即可: 但是这样边数是$n^2$ ...
- 单元测试Struts2的Action(包含源码)
很久没有从头搭建Struts2的环境了.最近,认真实践了单元测试Struts2.Spring等Java项目. 今天特意写的是单元测试Struts2的Action,遇到了不少问题,果然是实践出真知啊. ...
- JS中的Set 与去重
-----------------------Set 与去重----------------------- ES6 提供了新的数据结构 Set.它类似于数组,但是成员的值都是唯一的,没有重复的值.Se ...
- shell 脚本 helloworld
一.Hello World 脚本代码 #!/bin/sh echo "hello world" /bin/pwd 二.分析脚本 第 1 行:shell 脚本的固定写法 第 2 行: ...