JavaScript функция, изменяющая направление скобок - PullRequest
0 голосов
/ 17 июня 2020

У меня есть эти строки:

)hello(
this has ]some text[
flip }any{ brackets
even with )))]multiple[((( brackets

Как видите, все скобки не в том направлении.

Я хочу запустить функцию с именем flipBracketsDirection() для каждой строки , поэтому результат будет следующим:

flipBracketsDirection(')hello(');
// should return:  (hello)

flipBracketsDirection('this has ]some text[');
// should return:  this has [some text]

flipBracketsDirection('flip }any{ brackets');
// should return:  flip {any} brackets

flipBracketsDirection('even with )))]multiple[((( brackets');
// should return:  even with ((([multiple]))) brackets

Примечание: это нормально, если направление всегда менялось. Так что это тоже нормально:

flipBracketsDirection('flip (it) anyway');
// should return:  flip )it( anyway

Моя попытка:

function flipBracketsDirection(str: string) {
  return str
    // flip () brackets
    .replace(/\(/g, 'tempBracket').replace(/\)/g, '(').replace(/tempBracket/g, ')')

    // flip [] brackets
    .replace(/\[/g, 'tempBracket').replace(/\]/g, '[').replace(/tempBracket/g, ']')

    // flip {} brackets
    .replace(/\{/g, 'tempBracket').replace(/\}/g, '{').replace(/tempBracket/g, '}')
    ;
}

Мне интересно, лучше ли это создать функцию?

1 Ответ

1 голос
/ 17 июня 2020

В настоящее время ваш код выполняет 6 замен регулярных выражений (для каждой из которых требуется 1 проход) и дает сбой для строк, содержащих текст tempBracket (как указано @Kaiido в комментариях).

Это должно быть быстрее потому что делает один проход. Если все символы являются ASCII, функция flip может быть переписана для использования таблицы поиска, что сделает ее без ветвлений и потенциально даже быстрее.

function flipBracketsDirection(str) {
  function flip(c) {
    switch (c) {
      case '(': return ')';
      case ')': return '(';
      case '[': return ']';
      case ']': return '[';
      case '{': return '}';
      case '}': return '{';
      default: return c;
    }
  }
  return Array.from(str).map(c => flip(c)).join('');
}    

// testcases
let test = (x) => console.log(flipBracketsDirection(x));
test('flip (it) anyway');
test(')hello(');
test('this has ]some text[');
test('flip }any{ brackets');
test('even with )))]multiple[((( brackets');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...