JavaScript 算法和数据结构项目 - 计算找零

不知道问题出在了哪里,请大家帮我看一下

   **你目前的代码**
function checkCashRegister(price, cash, cid) {
 var total=0; 
 var change=cash-price;
 var arr=[0.01,0.05,0.1,0.25,1,5,10,20,100];
 var result=[]; 
 for (let i=0;i<cid.length;i++){
   total+=cid[i][1];
 };
 if (total<change) {
   return {status: "INSUFFICIENT_FUNDS", change: []};
 };
 if(total===change){
   return {status: "CLOSED", change: [...cid]};
 };
 for (let i=arr.length-1;i>0;i--){
   if (arr[i-1]<change<arr[i]){
     if (change>=cid[i-1][1]){
       result.push(cid[i-1]);
       change-=cid[i-1][1];
     }else {
       result.push([cid[i-1][0],arr[i-1]*Math.floor(change/arr[i-1])]);
       change-=arr[i-1]*Math.floor(change/arr[i-1]);
     };
     if (change===0){
       return {status: "OPEN", change: [...result]};
     }
   }
 }
return {status: "INSUFFICIENT_FUNDS", change: []};
}

checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]);
   **你的浏览器信息:**

用户代理是: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36

挑战: JavaScript 算法和数据结构项目 - 计算找零

挑战的链接:

注意,JavaScript 不是 Python,不能直接写这种表达,应该改成

arr[i-1] < change && change < arr[i]

这里还有一个问题:change 可能会大于 arr[i],但是 arr[i] 没有足够的零钱,这个时候你的程序会提前结束,因此应该改成

arr[i-1] < change

当你在 JavaScript 中计算 96.74 - 60 时,你会得到 36.739999999999995,所以需要取到最近的2位小数

change = (change - cid[i-1][1]).toFixed(2);

但是取到2位小数之后,0.00 === 0 永远是错误的,因为左右两边类型不同,可以改成 0.00 == 0


这样就差不多啦

Oshibuki 和 iLtc 的讲解很到位了,关于 iLtc 中判断条件修改后

可以通过 fCC 的所有测试,但是注意由于循环条件是

所以实际上会漏掉 arr[arr.length-1]100 的那个值,可以考虑修改为

for (let i = arr.length; i > 0; i--)

ps: 当然用 for (let i = arr.length - 1; i >= 0; i--) 的循环也可以,只是后面的用到 arr[i - 1] 都需要修改,取决于你。循环只要满足“循环不变”原则不漏掉元素就行。

同时注意这条语句也会产生小数计算问题,需要参考 iLtc 的内容修改。

懂了,非常感谢您,通过了 :smiling_face_with_three_hearts: :smiling_face_with_three_hearts: :smiling_face_with_three_hearts: :smiling_face_with_three_hearts: