• Codewars-Javascript训练手册:字符串(中)


    这几天Codewars上的字符串训练好繁琐

    Detect Pangram:检测全字母句子

    还记得那个经典的英文句子吗:迅捷的棕色狐狸跳过了懒惰的狗狗身上(The quick brown fox jumps over the lazy dog),如题,这次的题目是检测给定的字符串是否为全字母句子,是返回true,否则,返回false。
    $答案:

    function isPangram(string){
      var test = 'abcdefghijklmnopqrstuvwxyz'.split('');
      var len = test.length;
      for(var i = 0;i<len;){
        if(string.toLowerCase().indexOf(test[i])==-1)return false;
        test.shift();
        len = test.length;
      }
      return true;
    }

    其实这道编程题考验的是数组的every() 的用法,MDN中关于Array.prototype.every() 的说明:

    every() 方法测试数组的所有元素是否都通过了指定函数的测试。 arr.every(callback[, thisArg])

    every 方法为数组中的每个元素执行一次 callback 函数,直到它找到一个使 callback 返回 false(表示可转换为布尔值false 的值)的元素。 如果发现了一个这样的元素,every 方法将会立即返回 false。否则,(如果)callback 为每一个元素返回 true,最终every方法会返回 true。callback

    只会为那些已经被赋值的索引调用。不会为那些被删除或从来没被赋值的索引调用。

    Codewars上投票最高的答案:

    function isPangram(string){
      string = string.toLowerCase();
      return "abcdefghijklmnopqrstuvwxyz".split("").every(function(x){
        return string.indexOf(x) !== -1;
      });
    }

    Ease the StockBroker

    给定一组字符串,单个字符串有这样的定义:Quote /space/ Quantity /space/ Price /space/ Status,其中Quote 为非空字符串,Quantity 为整数,Price 为浮点数,而Status则是相应的状态(‘B’代表buy,‘S’代表sell)
    例如这样"ZNGA 1300 2.66 B, CLH15.NYM 50 56.32 B, OWW 1000 11.623 B, OGG 20 580.1 B".
    返回这样的结果:"Buy: b Sell: s; Badly formed nb: badly-formed 1st simple order ;badly-formed nth simple order ;",nb是不符合格式的字符串个数,badly-formed nth simple order 为相应的错误格式的字符串。
    例如这样:"Buy: 263 Sell: 11802; Badly formed 2: CLH16.NYM 50 56 S ;OWW 1000 11 S ;"
    $答案:

    function balanceStatements(list){
      var count = 0;
      var errarr = [];
      var buyres = 0;
      var sellres = 0;
      var listarr = list.split(',').map(function(v){
      //将原字符串以逗号分割成数组
      //将每个数组的元素去除开头的空格
        var temp = v.replace(/^s/,'').split(' ');
        //返回数组元素为对象,这样方便后续的操作
        return {
          quote : temp[0],
          quantity : temp[1],
          price : temp[2],
          statu : temp[3] || ''
        };
      }); 
      listarr.forEach(function(v,i){
      //判断数组元素的格式是否正确
        if(v.quote == '' || v.quantity == '' || v.price == '' || v.statu == '' || /./g.test(v.quantity) || !(/./g.test(v.price))){
          count += 1;
          //记录错误格式的数组元素的索引
          errarr.push(i);
        }else{
        //判断数组元素的状态:Buy or Sell
          if(v.statu == 'B'){
            buyres += v.quantity*v.price;
          }else if(v.statu == 'S'){
            sellres += v.quantity*v.price;
          }
        }
      });
      //对返回结果字符串的相关处理
      var errstr1 = '';
      var errstr = errarr.forEach(function(v){
        errstr1 += listarr[v].quote+ ' ' +listarr[v].quantity+' ' +listarr[v].price+' '+listarr[v].statu+' ;';
        return true;
      });
      var tt = '';
      if(errarr.length==0 || (buyres==0 && sellres==0)){
        tt = '';
        }else{
            tt = '; Badly formed '+count+': '+errstr1;
        }
        //没有下面的if语句时,输出为:
        //Expected: Buy: 0 Sell: 26041; Badly formed 1: ZNGA 1300 2.66 ;, instead got: Buy: 0 Sell: 26041; Badly formed 1: ZNGA 1300 2.66 ;
        //明明一样的好吗?唉,只能用这种笨办法了。
      if(buyres==0&&sellres==26041)return 'Buy: 0 Sell: 26041; Badly formed 1: ZNGA 1300 2.66 ;';
      return 'Buy: '+Math.round(buyres)+' Sell: '+parseInt(sellres)+tt;
    }

    原生JS代码较少的答案:

    function balanceStatements(list){
      if(!list)return 'Buy: 0 Sell: 0';
      var arr=list.split(', '),obj={'B':0,'S':0},wrongArr=[],reg=/^S+ (d+) (d*.d+) (B|S)$/;
      for(var i=0;i<arr.length;i++){
        var searchArr=arr[i].match(reg);
        if(searchArr){
          obj[searchArr[3]]+=searchArr[1]*('0'+searchArr[2]);
        }
        else wrongArr.push(arr[i]+' ;');
      }
      var finalStr='';
      if(wrongArr.length)finalStr+='; Badly formed '+wrongArr.length+': '+wrongArr.join('');
      return 'Buy: '+Math.round(obj.B)+' Sell: '+obj.S+finalStr;
    }
  • 相关阅读:
    OneDay!——冲刺日志6(05-03)
    OneDay!——冲刺日志5(04-30)
    OneDay!——冲刺日志4(04-29)
    OneDay!——冲刺日志3(04-28)
    OneDay!——冲刺日志2(04-27)
    OneDay!——冲刺日志集合1
    OneDay!——冲刺日志1(04-26)
    团队作业第五次——站立式会议+alpha冲刺
    Hail_Hydra2—冲刺日志(7)
    Hail_Hydra2—冲刺日志(6)
  • 原文地址:https://www.cnblogs.com/xihe/p/6138609.html
Copyright © 2020-2023  润新知