首頁 >web前端 >js教程 >TIL:後進先出的解決方案和正規表示式技術【CodeWars】

TIL:後進先出的解決方案和正規表示式技術【CodeWars】

Susan Sarandon
Susan Sarandon原創
2024-12-20 07:52:10901瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn