freeCodeCamp练习题

1. 创建一个函数,接受两个或多个数组,返回所给数组的 对等差分(symmetric difference) (△ or ⊕)数组.

给出两个集合 (如集合 A = {1, 2, 3} 和集合 B = {2, 3, 4}), 而数学术语 “对等差分” 的集合就是指由所有只在两个集合其中之一的元素组成的集合(A △ B = C = {1, 4}). 对于传入的额外集合 (如 D = {2, 3}), 你应该安装前面原则求前两个集合的结果与新集合的对等差分集合 (C △ D = {1, 4} △ {2, 3} = {1, 2, 3, 4}).

  • 去除单个数组重复的元素 delSame(a)
  • 实现数组对等差分differ(a,b)
  • 接收所有的参数,从0位置开始对等差分
function sym(a){
  var arr =arguments[0];
  for(var i=1;i<arguments.length;i++){ //用reduce
   arr = differ(arr,arguments[i]);
  }  
  return arr;
}
function differ(a,b) { 
  a = delSame(a);
  b = delSame(b);
  for(var i=0;i<a.length;i++) {
    if(b.indexOf(a[i])!==-1) {   
      b.splice(b.indexOf(a[i]),1); 
      a.splice(i,1);
      i--;      
    }
  }
  var arr = [];
  for (i=0;i<a.length;i++){ //改成concat
    arr.push(a[i]);
  }
  for (i=0;i<b.length;i++){
    arr.push(b[i]);
  }
  return arr;
}
function delSame(a) { //filter 和 splice
  var b = [];
  for(var i=0;i<a.length;i++) {
    if(b.indexOf(a[i])==-1)
     b.push(a[i]);
  }
  return b;
}

sym([1, 1, 2, 5], [2, 2, 3, 5]);

别人的解法
别人的解法2

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

cid 是一个二维数组,存着当前可用的找零.
当收银机中的钱不够找零时返回字符串 “Insufficient Funds”. 如果正好则返回字符串 “Closed”.
否则, 返回应找回的零钱列表,且由大到小存在二维数组中.

  • 收银机零钱等于找零钱,直接返回 “Closed”
  • 收银机零钱大于找零钱,直接返回"Insufficient Funds"
  • 收银机零钱小于找零钱
    • 从收银机大额的零钱开始比较
      • 零钱的额度大于找零钱,continue
      • 零钱的钱数=0,continue
      • 找零钱=0,break
      • 找零钱大于零钱的额度
        • 大于对应的零钱 直接向 arr 插入[零钱的额度,值]
        • 等于对应的零钱 直接向 arr 插入[零钱的额度,值] break
        • 小于对应的零钱 向 arr 插入[零钱的额度,取整(找零钱 / 零钱的额度)*零钱的额度]
function checkCashRegister(price, cash, cid) {
  var change = cash - price;
  var total=0;
  for(var i=0;i<cid.length;i++){
    total += cid[i][1];
  }
  if(change == total) return "Closed";
  if(change > total) return "Insufficient Funds";
  for (i in cid) {
    switch (cid[i][0]){
      case "PENNY":
        cid[i].push(0.01);
        break;
      case "NICKEL":
        cid[i].push(0.05);
        break;
      case "DIME":
        cid[i].push(0.1);
        break;
      case "QUARTER":
        cid[i].push(0.25);
        break;
      case "ONE":
        cid[i].push(1);
        break;
      case "FIVE":
        cid[i].push(5);
        break;
      case "TEN":
        cid[i].push(10);
        break;
      case "TWENTY":
        cid[i].push(20);
        break;
      case "ONE HUNDRED":
        cid[i].push(100);
        break;
    }
  }
  var arr = [];
  for(i=cid.length-1;i>=0;i--){
    if(change<cid[i][2]||cid[i][1]===0||change===0) {
      continue;
    }else
    if(cid[i][1]<=change){
      arr.push([cid[i][0],cid[i][1]]);change-=cid[i][1];
    }else{
      var sub = Math.floor(100*change/(cid[i][2]*100))*cid[i][2];
      arr.push([cid[i][0],sub]);
      change =(Math.ceil(change*100) - sub*100)/100; 
    }
  }
 if(change!==0)return"Insufficient Funds";
  return arr;
}

直接全部乘以100更方便,但是懒得改了,float计算精度乱了,直接最后向上取整。

3. 依照一个存着新进货物的二维数组,更新存着现有库存(在 arr1 中)的二维数组. 如果货物已存在则更新数量 . 如果没有对应货物则把其加入到数组中,更新最新的数量. 返回当前的库存数组,且按货物名称的字母顺序排列.
  • 循环数组2的每一项
    • 如果数组1存在,更新数量
    • 不存在,比较位置
      • 如果小于其中一项,splice(i,0,值)
      • 都不小于,push到结尾
function updateInventory(arr1, arr2) {
    // 请保证你的代码考虑到所有情况
  arr2.map(function(val){
    if(arr1.length===0) {
      arr1.push(val); return true;
      
    }
    for(var i in arr1){
      if(val[1]===arr1[i][1]) {
        arr1[i][0]+=val[0];break;
      }
      if(val[1]<arr1[i][1]) 
      {
        arr1.splice(i,0,val);break;
      }
      if(i==arr1.length-1){
        arr1.push(val);
      }    
    }
  });
  return arr1;
}

别人的思路是插入数据存在增加数量,不存就push在结尾,最后整体排序

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值