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

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

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

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

代码:

<script type="text/javascript">
	function checkCashRegister(price, cash, cid) {
		var change;
		var payback = {
			'PENNY': 1,
			'NICKEL': 5,
			'DIME': 10,
			'QUARTER': 25,
			'ONE': 100,
			'FIVE': 500,
			'TEN': 1000,
			'TWENTY': 2000,
			'ONE HUNDRED': 10000
		};
		//找零
		change = (cash - price) * 100;

		console.log('需要找零:' + change);

		var keys = Object.keys(payback);
		var i = keys.length - 1;

		var cidObj = {};
		var objCopy = {};
		for (i in cid) {
			cidObj[cid[i][0]] = cid[i][1] * 100;
			//复制一份,不能直接使用赋值语句
			objCopy[cid[i][0]] = cid[i][1] * 100;
		}

		console.log(cidObj);
		//遍历收银机中的零钱和最小零钱单位
		while (i >= 0) {
			while (payback[keys[i]] <= change && cidObj[keys[i]]) {
				change -= payback[keys[i]]; //如果要找零的钱大于最小找零单位且其中有钱,从其中找零
				cidObj[keys[i]] -= payback[keys[i]]; //找零后从零钱盒中减去已找零费用
			}
			i--;
		}

		console.log(cidObj);

		var result = [];
		//如果遍历之后change不为0,说明零钱不够找不开
		if (change) {
			return "Insufficient Funds";
		}

		for (i in cidObj) {
			if (cidObj[i]) {
				break;
			} else if (i === keys[keys.length - 1]) {
				return "Closed";
			}

		}

		for (i in objCopy) {
			if (objCopy[i] !== cidObj[i]) {
				result.unshift([i, (objCopy[i] - cidObj[i]) / 100]);
			}
		}
		return result;

	}
</script>

 

参考资料:
https://www.jianshu.com/p/6b76d60d8f49