2020-05-15 5kyu Car Park Escape
2020-05-15 本文已影响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)的新用法
- 多考虑使用模板语法、三元表达式
- 这题很有趣,我也做得很棒。