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

Exact Change


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

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

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

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

Global Object

代码:

 1 function checkCashRegister(price, cash, cid) {
 2         var obj = {};
 3         var num = 0;
 4         var odd = cash - price;
 5         var arr = [];
 6         var newArr = [];
 7         var a = 0;
 8
 9         for (var i = 0; i < cid.length; i++) {
10           //把这个二维数组的第一项和第二项分别变为新建对象的属性和属性值
11             var s = cid[i][0];
12             obj[s] = cid[i][1];
13           //累加得出收银机零钱的总和
14             num += cid[i][1];
15         }
16         if (odd === num) {
17           //如果收银机中的钱num和需要找的钱odd相等,返回字符串“Closed”
18             return "Closed";
19         }
20         for (var j = 0; j < Object.keys(obj).length; j++) {
21           //遍历对象属性
22             var name = Object.keys(obj)[8 - j];
23           //新建一个关于美元数额的数组
24             var figure = [100, 20, 10, 5, 1, 0.25, 0.1, 0.05, 0.01];
25
26             fi1();
27
28             if (a > 0) {
29                 arr.push([name, figure[j] * a]);
30                 a = 0;
31             }
32         }
33         function fi1() {
34             if (odd >= figure[j] && obj[name] >= figure[j]) {
35               //判断odd,如果大于某一面额的钞票且在收音机中有该面值的钞票
36                 odd = odd - figure[j];
37               //js的精度问题,2=1.999999,所以要用Math.round()来四舍五入
38                 odd = Math.round(odd * 10000) / 10000;
39                 obj[name] = obj[name] - figure[j];
40                 obj[name] = Math.round(obj[name]);
41               //这个a是用来判断是否有多张统一面值的钞票,这个在上面的if语句中用来给空数组arr添加元素
42                 a += 1;
43                 fi1();
44             }
45         }
46         if (odd === 0) {
47           //如果可以找零并且有剩余,就返回一个应找回的零钱列表
48             return arr;
49         } else if (odd > 0) {
50           //如果收音机中的钱不够找零时,返回字符串"Insufficient Funds"
51             return "Insufficient Funds";
52         }
53     }
54
55 checkCashRegister(19.50, 20.00, [
56     ["PENNY", 0.50],
57     ["NICKEL", 0],
58     ["DIME", 0],
59     ["QUARTER", 0],
60     ["ONE", 0],
61     ["FIVE", 0],
62     ["TEN", 0],
63     ["TWENTY", 0],
64     ["ONE HUNDRED", 0]
65 ]);
时间: 2024-12-29 07:32:10

FCC 高级算法题 收银机找零钱的相关文章

算法——一天一道算法题篇——找只出现一次的两个数

找只出现一次的两个数 题目: 一个整型数组里除了两个数字只出现一次之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 举例说明: 现在有一个数组:{1,3,4,2,4,3}; 假设数组元素的规模不是很大,想要找到只出现一次的元素,可以定义一个辅助数组,flag[100];里面存放的是数组元素出现的次数,flag数组的下标表示的是数组:{1,3,4,2,4,3}里的元素. 代码如下: package hello.ant; public class AlogArrayFind2 {

fcc 基础算法题

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

认真对待每一道算法题 之 找明星问题 - 淘宇瀚

n个人中只有一个明星,明星不认识其他所有的人,而其他人都认识明星,不是明星的人可能认识也可能不认识.你每次只可以问一个人是否认识另一个人这样的问题,问最少问多少次可以找出明星. 做法1: 将所有人站队,按照顺序(假如编号分别为1.2.3..n),首先问1,2互相认识,有四种情况出现: (1)1 认识 2,2不认识1, 认识别人的肯定不是明星,排除1: (2)1 不认识2,2认识1, 根据(1)的道理,同样可以排除2: (3)1与2 互相认识,可以断定,两个人都不是明星,随机删除一个就好: (4)

c语言趣题之“找零钱的方法数量 ”

/* Name: Copyright: Author: Date: 31-12-14 16:51 Description: 找零钱的方法数量 描述 我们知道人民币有1.2.5.10.20.50.100这几种面值. 现在给你n(1≤n≤250)元,让你计算换成用上面这些面额表示且总数不超过100张,共有几种. 比如4元,能用4张1元.2张1元和1张2元.2张2元,三种表示方法. 输入 输入有多组,每组一行,为一个整合n. 输入以0结束. 输出 输出该面额有几种表示方法. 样例输入 1 4 0 样例

算法导论:找零钱问题

题目 假设有1元.2元.5元.10元.20元.50元.100元.200元面额的硬币或者纸币.现在需要N元钱,有多少种零钱组合方式? 解题 DFS比较简单 public void DFS(int m,int[]A,int start,ArrayList<String>result,String str){ if(m == 0){ result.add(str); return; } if(A[start]> m){ return; } for(int i = start;i<A.le

算法题:找出整数数组中两个只出现一次的数字

问题:一个整数数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度为O(n),空间复杂度为O(1). 分析:这是一个很新颖的关于位运算的题目. 首先考虑这个问题的一个简单版本:一个整数数组里除了一个数字之外,其他的数字都出现两次,请写程序找出这个只出现一次的数字. 这个问题的突破口在哪?题目中数组的性质是只有一个整数出现一次,其他的都出现两次.这样的话就使我们想到了异或运算的性质:任何一个数字异或它自己都等于0.也就是说如果从头到尾依次异或数组中的每

算法题之找出数组里第K大的数

问题:找出一个数组里面前K个最大数. 解法一(直接解法): 对数组用快速排序,然后直接挑出第k大的数.这种方法的时间复杂度是O(Nlog(N)).N为原数组长度. 这个解法含有很多冗余,因为把整个数组都排序了,而实际上我们不需要这样做. 解法二(K数组排序): 首先,创建一个长度为K的空数组.从原数组中先挑出K个数进行排序并放到这个空数组中.这一步的时间复杂度是O(Klog(K)). 接着,从剩下的N-K个值中,依次遍历并与上面数组的末尾的数(即里面的最大数)相比较,并插入到合适位置.这一步的时

算法题:找出一个数组中依次最大的k个元素

package arithmetic; import java.util.Arrays; /** * 找出一个数组中依次最大的k个元素 * @author SHI */ public class FindMaxFigure { public static void main(String[] args) { int[] a=new int[]{1,5,-1,8,0,2}; System.out.println(Arrays.toString(findBigFigure(a, 3))); } /*

算法题:找出同一个序列中的最大值和最小值

package arithmetic; /** * 同时找出一个序列中最大值和最小值 * 分两种情况:(1)序列只有两个元素 * (2)序列有多个元素,有多个元素分别从序列的两端开始查找 * @author SHI */ public class MaxAndMin { public static void main(String[] args) { int[] a = { 122, 41, 4, 5, 7, 2, 89, 122, 34, 56 }; int low = 0; int high