首页 > web前端 > js教程 > TIL:后进先出的解决方案和正则表达式技术【CodeWars】

TIL:后进先出的解决方案和正则表达式技术【CodeWars】

Susan Sarandon
发布: 2024-12-20 07:52:10
原创
866 人浏览过

TIL: LIFO Solution and Regular Exprresion Techniques【CodeWars】

概述 ?

方向缩减挑战要求您从方向数组中找到最短路线

示例:

Input
-> Output
["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]
-> ["WEST"]
/* 
Because moving "NORTH" and "SOUTH", or "EAST" and "WEST", is unnecessary.
*/

/* 
Case: omit the first "NORTH"-"SOUTH" pair 
["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]
-> ["SOUTH", "EAST", "WEST", "NORTH", "WEST"]

Case: omit the "EAST"-"WEST" pair 
-> ["SOUTH", "NORTH", "WEST"]

Case: omit the "NORTH"-"SOUTH" pair 
-> ["WEST"]
*/

// this case cannot be reduced:
["NORTH", "WEST", "SOUTH", "EAST"]
-> ["NORTH", "WEST", "SOUTH", "EAST"]

登录后复制

解决方案1:后进先出

function dirReduc(plan) {
  var opposite = {
    'NORTH': 'SOUTH', 'EAST': 'WEST', 'SOUTH': 'NORTH', 'WEST': 'EAST'};
  return plan.reduce(function(dirs, dir){
      if (dirs[dirs.length - 1] === opposite[dir])
        dirs.pop(); // Remove last direction if it's the opposite
      else
        dirs.push(dir); // Otherwise, add current direction to the stack
      return dirs;
    }, []);
}
登录后复制

这是使用reduce实现的LIFO(后进先出)方法。

步骤:

  1. 声明一个空堆栈(目录)
  2. 对于输入数组(plan)中的每个方向,检查堆栈(dirs)的最后一个元素是否与当前方向相反
  3. 如果它们相反,则从堆栈中弹出最后一个元素(并跳过当前方向)。否则,将当前方向压入堆栈。
  4. 重复此过程,直到处理完所有指示。

解决方案2:正则表达式

function dirReduce(arr) {
  let str = arr.join(''), pattern = /NORTHSOUTH|EASTWEST|SOUTHNORTH|WESTEAST/;
  while (pattern.test(str)) str = str.replace(pattern,''); // Remove pairs while they exist
  return str.match(/(NORTH|SOUTH|EAST|WEST)/g)||[];
}
登录后复制

替代版本:

function dirReduc(arr) {
  const pattern = /NORTHSOUTH|EASTWEST|SOUTHNORTH|WESTEAST/;
  let str = arr.join('');

  while (pattern.test(str)) {
    str = str.replace(pattern, ''); // Remove pairs while they exist
  }

  const result = str.match(/(NORTH|SOUTH|EAST|WEST)/g);
  return result || [];
}
登录后复制

步骤:

  1. 将输入数组 (arr) 连接到单个字符串中,以便我们可以使用正则表达式对其进行操作。
  2. 定义匹配相反方向对的正则表达式(模式) (例如,“南北”、“东西”)。
  3. 在循环中使用替换方法来删除正则表达式找到的任何方向对。
  4. 删除所有对后,使用 match 方法从字符串中提取剩余的方向并将它们作为数组返回。

讨论和见解?

我认为该解决方案的最低情况如下:

1. ["SOUTH", "EAST", "WEST", "NORTH"]
-> []

2. ["NORTH", "WEST", "SOUTH", "EAST"]
-> ["NORTH", "WEST", "SOUTH", "EAST"]
登录后复制

我更喜欢解决方案2,因为它简洁并且巧妙地使用了正则表达式。最初,我无法想象用正则表达式来解决它,但是使用 join、match、while、replace 和 test 方法来消除对是令人印象深刻的。

如果您对这些解决方案感到好奇或想探索更多挑战,请访问此处。
欢迎在下方留言!

感谢您的阅读?

以上是TIL:后进先出的解决方案和正则表达式技术【CodeWars】的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板