FCC算法题--Exact Change

题目:

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

cid 是一个二维数组,存着当前可用的找零.

当收银机中的钱不够找零时返回字符串 "Insufficient Funds". 如果正好则返回字符串 "Closed".

否则, 返回应找回的零钱列表,且由大到小存在二维数组中.

当你遇到困难的时候,记得查看错误提示、阅读文档、搜索、提问。

这是一些对你有帮助的资源:

  1 function checkCashRegister(price, cash, cid) {
  2   var change;
  3   var sumCid;
  4
  5 // Here is your change, ma‘am.
  6   var obj = {
  7     penny:     cid[0][1],
  8     nickel:    cid[1][1],
  9     dime:      cid[2][1],
 10     quarter:   cid[3][1],
 11     one:       cid[4][1],
 12     five:      cid[5][1],
 13     ten:       cid[6][1],
 14     twenty:    cid[7][1],
 15     oneHundred:cid[8][1]
 16   };
 17
 18   //购买价格(price), 付款金额 (cash), 收银机中零钱 (cid)
 19   change = cash - price;
 20   //console.log("typeof(change):", typeof(change)); //number
 21   //console.log("change:", change);
 22
 23   sumCid =
 24     obj.penny +
 25     obj.nickel +
 26     obj.dime +
 27     obj.quarter +
 28     obj.one +
 29     obj.five +
 30     obj.ten +
 31     obj.twenty +
 32     obj.oneHundred;
 33
 34   sumCid = Number(sumCid.toFixed(2));  //保留两位小数
 35
 36   //console.log(typeof(sumCid)); //number
 37   //console.log("sumCid:", sumCid);
 38
 39   if (sumCid < change) {
 40       //console.log("sumCid小于change!");
 41     return "Insufficient Funds";  //余额不足
 42   }
 43   else if (sumCid === change) {
 44       //console.log("sumCid等于change!");
 45     return "Closed";
 46   }
 47   else {
 48       // 1.零钱不够,返回余额不足
 49       // 2.零钱足够,找回零钱
 50       //console.log("sumCid大于change!");
 51       overChange(change, cid, sumCid);
 52   }
 53 }
 54
 55 function overChange(change, arr, sumCid) {
 56   var array = [];
 57   var len = arr.length;
 58
 59   for (var i = len - 1; i >= 0; i--) {
 60       if (arr[i][1] === 0) continue;
 61
 62       if (arr[i][1] < change) {
 63         array.push(arr[i]);
 64       change -= arr[i][1];
 65       change = Number(change.toFixed(2));
 66       //console.log("current change:", change);
 67       }
 68
 69       else if (arr[i][1] > change) {
 70       var x = arr[i][0];  // 取得零钱名称
 71         //console.log("x:", x);
 72         var y = 0;
 73
 74         switch(x) {
 75           case "ONE HUNDRED":
 76             y = Math.floor(change / 100) * 100;
 77             break;
 78           case "TWENTY":
 79             y = Math.floor(change / 20) * 20;
 80             break;
 81           case "TEN":
 82             y = Math.floor(change / 10) * 10;
 83             break;
 84           case "FIVE":
 85               y = Math.floor(change / 5) * 5;
 86               break;
 87             case "ONE":
 88               y = Math.floor(change / 1);
 89               break;
 90             case "QUARTER":
 91               y = Math.floor(change / 0.25) * 0.25;
 92               break;
 93             case "DIME":
 94               y = Math.floor(change / 0.10) * 0.10;
 95               break;
 96             case "NICKEL":
 97               y = Math.floor(change / 0.05) * 0.05;
 98               break;
 99             case "PENNY":
100               y = Math.floor(change / 0.01) * 0.01;
101               break;
102        }
103
104         console.log(y);
105         console.log(sumCid - arr[i][1] < change);
106
107         if (y === 0 && sumCid - arr[i][1] < change) {
108         //console.log("Insufficient Funds");
109         return "Insufficient Funds";
110         }
111
112         else if (y === 0) {
113           continue;
114         }
115
116         else {
117             if (y < 1) {
118                 y = y;
119             }
120         var array1 = [];
121           array1.push(arr[i][0]);
122           array1.push(y);
123           array.push(array1);
124         change -= y;
125         change = Number(change.toFixed(2));
126         //console.log("current change:", change);
127       }
128       }
129   }
130
131   if (change === 0) {
132       //console.log("array:", array);
133       return array;
134   }
135   else {
136       //console.log("Insufficient Funds");
137       return "Insufficient Funds";
138   }
139
140 }
141
142 checkCashRegister(3.26, 100.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]);

checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]) 应该返回一个数组.

checkCashRegister(19.50, 20.00, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 应该返回一个字符串.

checkCashRegister(19.50, 20.00, [["PENNY", 0.50], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 应该返回一个字符串.

checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]) 应该返回 [["QUARTER", 0.50]].

checkCashRegister(3.26, 100.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]) 应该返回 [["TWENTY", 60.00], ["TEN", 20.00], ["FIVE", 15], ["ONE", 1], ["QUARTER", 0.50], ["DIME", 0.20], ["PENNY", 0.04]].

checkCashRegister(19.50, 20.00, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 应该返回 "Insufficient Funds".

checkCashRegister(19.50, 20.00, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1.00], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 应该返回 "Insufficient Funds".

checkCashRegister(19.50, 20.00, [["PENNY", 0.50], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 应该返回 "Closed".

---------------------------------------------------------------------------------------

我的Free Code Camp地址

时间: 2024-10-13 16:55:10

FCC算法题--Exact Change的相关文章

FCC算法题--Inventory Update

题目: 依照一个存着新进货物的二维数组,更新存着现有库存(在 arr1 中)的二维数组. 如果货物已存在则更新数量 . 如果没有对应货物则把其加入到数组中,更新最新的数量. 返回当前的库存数组,且按货物名称的字母顺序排列. 当你遇到困难的时候,记得查看错误提示.阅读文档.搜索.提问. 这是一些对你有帮助的资源: Global Array Object 1 function updateInventory(arr1, arr2) { 2 // All inventory must be accou

FCC上的javascript算法题之中级篇

FCC中的javascript中级算法题解答 中级算法的题目中用到了很多js的知识点,比如迭代,闭包,以及对json数据的使用等等,现在将自己中级算法的解答思路整理出来供大家参考讨论.欢迎大家提出新的思路,写出更简单的解法. 1.给一个包含两个数字的数组.返回这两个数字和它们之间所有数字的和. 说明:最小的数字并非总在最前面 如:sumAll([4, 1]) 应该返回 10. sumAll([5, 10]) 应该返回 45. function sumAll(arr) { var max=Math

FCC的javascript初级算法题解答

FCC上的javascript基础算法题 前一阵子做的基础算法题,感觉做完后收获还蛮大的,现在将自己的做法总结出来,供大家参考讨论.基本上做到尽量简短有效,但有些算法还可以继续简化,比如第七题若采用正则表达式来匹配,则一行代码就可以完成需求.欢迎大家提出不同解法.末尾有FCC的链接,感兴趣的同学可以去做一做. 1.翻转字符串 function reverseString(str) { var arr=str.split(""); str=arr.reverse().join("

fcc 基础算法题

fcc 基础算法题 fcc Reverse a String 翻转字符串 先把字符串转化成数组,再借助数组的reverse方法翻转数组顺序,最后把数组转化成字符串. function reverseString(str) { var arr =str.split(""); //string.split("");以""分割字符串 并返回新的数组 不改变原字符串 arr.reverse(); //反转数组 返回数组的引用 改变原数组 arr = ar

FCC 高级算法题 收银机找零钱

Exact Change 设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) 作为第三个参数. cid 是一个二维数组,存着当前可用的找零. 当收银机中的钱不够找零时返回字符串 "Insufficient Funds". 如果正好则返回字符串 "Closed". 否则, 返回应找回的零钱列表,且由大到小存在二维数组中. Global Object

js中字符和数组一些基本算法题

最近在刷 fcc的题,跟升级打怪一样,一关一关的过,还挺吸引我的.今天抽时间把 Basic Algorithm Scritping  这部分题做了,根据一些提示,还是比较简单的.有些题的处理方式 方法,我想值得借鉴.比如在项目中有时候要处理一个字符,如果想不到一些相关的方法,还挺费事的,所以,在此记录下来,如果以后遇到一些字符或者数组处理,可以来翻翻这篇文章,希望以此得到一些提示而不是去翻文档.   看到此博文的博友,有更好更简单的代码或者好的想法,请留言交流(我一直觉得只有学习别人的优秀代码才

POJ 2581 Exact Change Only(dp)

Language: Default Exact Change Only Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2584   Accepted: 883 Description Boudreaux reached over and shook awake Thibodeaux, who had dozed off somewhere in New Mexico. "Where we at?" Thibod

算法题库

1. 时针分针重合几次 表面上有60个小格,每小格代表一分钟, 时针每分钟走1/12小格,分针每分钟走1小格,从第一次重合到第二次重合分针比时针多走一圈即60小格,所以 60/(1-1/12)=720/11 每隔720/11分才重合一次(而并不是每小时重合一次) 1440里有22个720/11,如果说算上0点和24点,那也是重合23次而已,但我觉得0点应该算到前一天的24点头上,所以每一天循环下来重合22次啊 2. 找出字符串的最长不重复子串,输出长度 建一个256个单元的数组,每一个单元代表一

poj 2581 Exact Change Only (dp)

 Description Boudreaux reached over and shook awake Thibodeaux, who had dozed off somewhere in New Mexico. "Where we at?" Thibodeaux groggily yawned. "Not in Vegas, I gua-ran-tee, but could you get my knapsack?" Boudreaux asked, gest