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的更多相关文章

  1. FCC高级编程篇之Validate US Telephone Numbers

    Validate US Telephone Numbers Return true if the passed string is a valid US phone number. The user ...

  2. FCC高级编程篇之Make a Person

    Make a Person Fill in the object constructor with the following methods below: getfirstname() getLas ...

  3. FCC高级编程篇之Symmetric Difference

    Symmetric Difference Create a function that takes two or more arrays and returns an array of the sym ...

  4. FCC高级编程篇之Record Collection

    Record Collection You are given a JSON object representing a part of your musical album collection. ...

  5. FCC(ES6写法) Exact Change

    设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) 作为第三个参数. cid  ...

  6. (十三) [终篇] 一起学 Unix 环境高级编程 (APUE) 之 网络 IPC:套接字

    . . . . . 目录 (一) 一起学 Unix 环境高级编程 (APUE) 之 标准IO (二) 一起学 Unix 环境高级编程 (APUE) 之 文件 IO (三) 一起学 Unix 环境高级编 ...

  7. unix环境高级编程基础知识之第二篇(3)

    看了unix环境高级编程第三章,把代码也都自己敲了一遍,另主要讲解了一些IO函数,read/write/fseek/fcntl:这里主要是c函数,比较容易,看多了就熟悉了.对fcntl函数讲解比较到位 ...

  8. C++面向对象高级编程(四)基础篇

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 一.Static 二.模板类和模板函数 三.namespace 一.Static 静态成员是“类级别”的,也就是它和类的地位等同,而普通成员是“ ...

  9. C++面向对象高级编程(三)基础篇

    技术在于交流.沟通,转载请注明出处并保持作品的完整性. 概要 一.拷贝构造 二.拷贝赋值 三.重写操作符 四.生命周期 本节主要介绍 Big Three 即析构函数,拷贝构造函数,赋值拷贝函数,前面主 ...

随机推荐

  1. 使用jquery获取ul中当前正在点击的li的索引

    <ul class="list"> <li>哈哈</li> <li>呵呵</li> <li>嘻嘻</l ...

  2. ListView的Item动画

    1.效果图 2.需求就是点击item歌曲时,实现一种飞入到预约按钮处的效果 3.思路:在布局文件中加入了一个条目布局,和listView的item一样,点击listView的item时,使用给条目布局 ...

  3. angular自定义指令-directive

    Directive究竟是个怎么样的一个东西呢?我个人的理解是这样的:将一段html.js封装在一起,形成一个可复用的独立个体,具体特定的功能.下面我们来详细解读一下Directive的一般性用法. v ...

  4. ng-repeat 中的 track by $index

    用ng-repeat指令遍历一个javascript数组,当数组中有重复元素的时候,angularjs会报错,这是因为ng-Repeat不允许collection中存在两个相同Id的对象. 对于数字或 ...

  5. Unity 自己旋转 方法

    transform.Rotate(Vector3.up * Time.deltaTime * 100);

  6. post数据html数据获取危险处理办法

      基础小知识 ValidateRequest属性是Page类中比较常用的属性,用来指示是否对输入数据进行潜在危险性检查.在默认情况下为True,就是表示 “是对输入的数据进行潜在危险性检查”,这个属 ...

  7. Extjs win

    //创建window var win = Ext.create("Ext.window.Window", { id: "myWin", title: " ...

  8. MySQL主从宕机的解决方法

    测试系统:centos6.5系统 测试环境IP地址划分: master: 192.168.80.130 slave:192.168.80.143 slave:192.168.80.146 首先模拟(M ...

  9. 递归树处理,配合vue的vueTreeselect组件使用

    在项目中经常会使用到tree,并且需要对递归树进行操作. 在vue项目中,使用vue-treeselect插件(https://vue-treeselect.js.org/) 使用中遇到的问题: 1. ...

  10. Javascript 实现锚点(Anchor)间平滑跳转

    (function($){ $.fn.scroller = function(options){ var defaultVal = { duration: }; var obj = $.extend( ...