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 即析构函数,拷贝构造函数,赋值拷贝函数,前面主 ...
随机推荐
- php方法----将数组按照键值进行排序
将数组按照键值进行排序 array_multisort(array_column($arr,'first'),SORT_ASC,$arr);
- Xcode7 下导入第三方库 图文介绍
网上没有很好的图文介绍,干脆我自己写一个好了,方便新手入门. 这里以导入著名的第三方网络库AFNetWorking v3.0.4和数据库FMDB v2.6.2为例进行说明. 好,下面开始. 下载源文件 ...
- HDU1231 最长连续子序列
最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- Unity图集分割
using System.IO;using UnityEngine;using UnityEditor; public class TestSaveSprite{ [MenuItem("LL ...
- URL中一些特殊符号的替代符
下表中列出了一些URL特殊符号及编码 十六进制值 1.+ URL 中+号表示空格 %2B 2.空格 URL中的空格可以用+号或者编码 %20 3./ 分隔目录和子目录 %2F 4.? 分隔实际的 UR ...
- [luogu] P3202 [HNOI2009]通往城堡之路(贪心)
P3202 [HNOI2009]通往城堡之路 题目描述 听说公主被关押在城堡里,彭大侠下定决心:不管一路上有多少坎坷,不管城堡中的看守有多少厉害,不管救了公主之后公主会不会再被抓走,不管公主是否漂亮. ...
- promise的原理
promise的原理 一旦状态改变,就不会再变,任何时候都可以得到这个结果.Promise 对象的状态改变,只有两种可能:从 pending 变为 fulfilled 和从 pending 变为 re ...
- POI 详细介绍
Apache POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.目前POI已经有了Ruby版本. 结构: HSSF - 提供读写Microsoft Excel XLS格式 ...
- centos7修改网卡名
http://blog.csdn.net/henulwj/article/details/47061023
- HDU 4324 Contest 3
直接DFS即可 #include <iostream> #include <string.h> #include <algorithm> #include < ...