美文网首页
2020-05-15 5kyu Car Park Escape

2020-05-15 5kyu Car Park Escape

作者: 苦庭 | 来源:发表于2020-05-15 22:07 被阅读0次

    https://www.codewars.com/kata/591eab1d192fe0435e000014/javascript

    My answer

    function escape(arr){
      var res = [];
      var curPos, next, diff, dCount = 0, dFlag=false, startFlag=true;
      for(let level=0; level<arr.length; level++){
        if(!arr[level].includes(2) && startFlag) continue;
        if(startFlag) curPos = arr[level].indexOf(2);
        startFlag = false;
        diff = 0;
        
        if(curPos == arr[level].length-1 && level == arr.length-1) return res;
    
        if(arr[level].reduce((a,b)=>a+b) == 0 || level == arr.length-1){
          next = arr[level].length-1;
          diff = curPos - next;
        }else{
          next = arr[level].indexOf(1);
          diff = curPos - next;
        } 
        
        if(diff>0) {
          res.push("L"+diff);
          curPos = curPos - diff;
          dFlag = false;
        } else if(diff<0) {
          res.push("R"+(-diff));
          curPos = curPos - diff;
          dFlag = false;
        }
        let dCount = 0;
        if(arr[level][curPos]===1 && dFlag) continue;
        for(let l=level; arr[l][curPos]===1;  ++dCount, ++l) ;
        if(dCount!=0) res.push("D"+(dCount));
        dFlag = true;
      }
      return res;
    }
    

    哪里要改进?

    • 使用了很多中间变量,有的可以通过思路转换来优化(比如学BA那样,最后一行的时候单独处理再拼接到原数组后面)
    • 比较这里while循环比for循环的好处?使用for循环的时候思维总是比较线性,针对原停车场是一层一层来处理;while循环只要满足“没超过最低层数”就一直往下走(在连续下楼的问题上思维更加不受index的制约)。anyway只要能完成题目,都是好循环。

    Best Answer

    function escape(carpark){
      var seq = [], i=carpark.findIndex(r=>r.includes(2)), x=carpark[i].indexOf(2);
      while(i<carpark.length-1) {
        let idx = carpark[i].indexOf(1), down = 0,
            dist = idx-x;
        seq.push(dist<0?`L${-dist}`:`R${dist}`);
        for(;carpark[i][idx]===1; down++,i++);
        seq.push(`D${down}`);
        x = idx;
      }
      return x===carpark[0].length-1?seq:seq.concat(`R${carpark[0].length-1-x}`);
    }
    

    哪里好?

    • 大量使用三元表达式、模板字符串简洁语句
    • findIndex()参数为回调函数能够在数组里面找到满足该回调函数的元素
    • 这里的i是指针,表明当前处理位置。因此最后一行需要单独处理。

    Recap

    • 熟悉了Array.prototype.findIndex(callbackFn)的新用法
    • 多考虑使用模板语法、三元表达式
    • 这题很有趣,我也做得很棒。

    相关文章

      网友评论

          本文标题:2020-05-15 5kyu Car Park Escape

          本文链接:https://www.haomeiwen.com/subject/cfahohtx.html