项目实战:收银机,无法通过最后一个测试


#1

浏览器信息

  • 浏览器名称,版本号:chrome 69.0.3497.100
  • 操作系统:Windows 10 专业版 x64

题目相关

问题描述

这个是我的解决方案

我很困惑,为什么会通不过测试,这个问题困扰了我好久


#2

这是你最后一次测试返回的结果:
image

你的 change 属性,对应的是一个 Object。题目要求的是一个二维数组

代码我还没看,你可以先自己调试一下,如果有问题的话在这里说就好


#3

感谢星哥的回复,确实是返回结果不符合条件,我也做了修正。

不过我困惑的是在 freeCodeCamp 编辑器里执行的结果 和 在 codepen 里面执行的结果有出入,freeCodeCamp 编辑器在while 循环没有结束的时候跳出了循环,如图所示,所以测试没有通过


#4

感觉截图里左边和右边应该不是同一个函数的结果?你的代码还是和上面 codepen 链接的一样么?
发这里也行,我去调试一下


#5
 function checkCashRegister(price, cash, cid) {
  //货币名字和金额的映射
  var cidObject = {
    "PENNY": 0.01,
    "NICKEL": 0.05,
    "DIME": 0.1,
    "QUARTER": 0.25,
    "ONE": 1,
    "FIVE": 5,
    "TEN": 10,
    "TWENTY": 20,
    "ONE HUNDRED": 100
  };
  var cidArr = [0.01,0.05,0.1,0.25,1,5,10,20,100];
  var cidNameArr = ["PENNY","NICKEL","DIME","QUARTER","ONE","FIVE","TEN","TWENTY","ONE HUNDRED"];
  //将参数中的收银机内零钱转换成对象
  var cidAmountObj = {};
  cid.map(function(val){
    cidAmountObj[val[0]] = Math.round(val[1]/cidObject[val[0]]); 
    return val;
  });
  //需要的找零金额
  var change = cash-price;
  console.log('应该找零:'+change);
  //选择合适的收银机内的找零货币种类
  var breakpoint;
  for (var i=0;i<9;i++) {
    if (change > cidArr[i]) {
      breakpoint = i;
    }
  }
  var moneyName;
  //已经找零的金额
  var tryChange = 0;
  //是否找不开
  var bad = false;
  //已找零的货币种类及金额
  var result = {
    "PENNY": 0,
    "NICKEL": 0,
    "DIME": 0,
    "QUARTER": 0,
    "ONE": 0,
    "FIVE": 0,
    "TEN": 0,
    "TWENTY": 0,
    "ONE HUNDRED": 0
  };
  while(tryChange != change || !bad) {//开始找零,遍历所有的货币种类
    moneyName = cidNameArr[breakpoint];
    while(cidAmountObj[moneyName]>0) {//当前选择的货币种类依次找出去
      console.log('找一个:'+moneyName);
      tryChange += cidObject[moneyName];
      tryChange = Math.round(tryChange*100)/100;
      if (tryChange > change) {
        console.log('找多了,退回来:'+moneyName);
        tryChange -= cidObject[moneyName];
        tryChange = Math.round(tryChange*100)/100;
        break;
      }
      result[moneyName] += cidObject[moneyName];
      result[moneyName] = (result[moneyName]*1).toFixed(2)*1;
      cidAmountObj[moneyName] -= 1;
      console.log('还剩'+cidAmountObj[moneyName]+'个'+moneyName);
    }
    console.log(tryChange);
    if (tryChange == change)  {
      console.log('找完了');
      break;
    }
    if(--breakpoint<0) {
      console.log('没找开');
      bad = true;
      break;
    }
  }
  if (bad) {
    return {status: "INSUFFICIENT_FUNDS", change: []};
  }
  var closed = true;
  for (i=0;i<9;i++) {
    moneyName = cidNameArr[i];
    if (cidAmountObj[moneyName]) {
      closed = false;  
    }
  }
  //整理找零为所需要的格式
  var resultArr = [];
  var temp;
  for (i=0;i<9;i++){
    if (result[cidNameArr[i]]) {
      temp = result[cidNameArr[i]];
      resultArr.push([cidNameArr[i], temp]);
    } else {
      resultArr.push([cidNameArr[i], 0]);
    }
  }
  if (closed) {
    console.log('没钱了');
    return {status: "CLOSED", change: resultArr};
  }
  return {status: "OPEN", change: resultArr}
}

// Example cash-in-drawer array:
// [["PENNY", 1.01],
// ["NICKEL", 2.05],
// ["DIME", 3.1],
// ["QUARTER", 4.25],
// ["ONE", 90],
// ["FIVE", 55],
// ["TEN", 20],
// ["TWENTY", 60],
// ["ONE HUNDRED", 100]]

console.log(checkCashRegister(19.5, 20, [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]));

是的同一套代码,就是,就是执行结果不一样


#6

重置试一下吧。目前,我这里看到的是,最后一个是通过的。第二个和第三个没通过。

第二个结果:image
题目要求:{status: "OPEN", change: [["QUARTER", 0.5]]}

第三个结果:image
题目要求:{status: "OPEN", change: [["TWENTY", 60], ["TEN", 20], ["FIVE", 15], ["ONE", 1], ["QUARTER", 0.5], ["DIME", 0.2], ["PENNY", 0.04]]}

目前比较出来的是,第二个你的数组比要求的多,第三个你的数组元素顺序不太对
我周末再仔细研究下,目前我博客上的代码也通不过测试😂。题目本身要求的返回结果和之前的不同了,不过改起来应该不难