Я построил функцию, которая возвращает "YES" или "NO" на основе некоторого ввода. Ввод представляет собой строку скобок, которые должны быть сбалансированы.

Примере:

Сбалансированный - {[()]}
Несбалансированный - {[(])}

Функция возвращает undefined для этого вызова.

isBalanced ( ' { [ ( ] ) } ');

Устали от отладки. Я уверен, что внутри цикла что-то не так.

function isBalanced(s) {
    let brackets = s.split('');
    let balanced = "YES";
    const closedBrackets = ')]}';
    const bracketCompliment = {
        '(' : ')',
        '[' : ']',
        '{' : '}'
    };
    for(let idx = 0; idx < brackets.length; idx++){
        const item = brackets.splice(0, 1)[0];
        if(closedBrackets.includes(item)){
            balanced = "NO";   
            return;
        }
        const closeIdx = brackets.indexOf(bracketCompliment[item]);
        const remainder = closeIdx % 2;
        if(closeIdx === -1 || remainder !== 0){
            balanced = "NO";
            return;
        } else{
            brackets.splice(closeIdx, 1);
        }
    }
    return balanced;
}
1
rach8garg 21 Авг 2018 в 18:23

5 ответов

Лучший ответ

Вы должны return balanced; и не return;

function isBalanced(s) {
  let brackets = s.split('');

  const closedBrackets = ')]}';

  const bracketCompliment = {
    '(': ')',
    '[': ']',
    '{': '}',
  };

  for (let idx = 0; idx < brackets.length; idx += 1) {
    const item = brackets.splice(0, 1)[0];

    if (closedBrackets.includes(item)) {
      return 'NO';
    }

    const closeIdx = brackets.indexOf(bracketCompliment[item]);

    if (closeIdx === -1 || closeIdx % 2 !== 0) {
      return 'NO';
    }
    
    brackets.splice(closeIdx, 1);
  }

  return 'YES';
}

console.log(isBalanced('{[(])}'));
console.log(isBalanced('{()}'));
4
Grégory NEUT 21 Авг 2018 в 16:00

Вы возвращаете значение balanced только тогда, когда входная строка фактически сбалансирована. В обоих случаях, когда вы устанавливаете balanced = "NO", вы немедленно возвращаетесь без значения. Если вы замените эти операторы return на операторы break, функция будет работать так, как ожидается.

function isBalanced(s) {
    let brackets = s.split('');
    let balanced = "YES";
    const closedBrackets = ')]}';
    const bracketCompliment = {
        '(' : ')',
        '[' : ']',
        '{' : '}'
    };
    for (let idx = 0; idx < brackets.length; idx++) {
      const item = brackets.splice(0, 1)[0];
      if (closedBrackets.includes(item)) {
        balanced = "NO";
        break;
      }
      const closeIdx = brackets.indexOf(bracketCompliment[item]);
      const remainder = closeIdx % 2;
      if (closeIdx === -1 || remainder !== 0){
        balanced = "NO";
        break;
      } else{
        brackets.splice(closeIdx, 1);
      }
    }

    return balanced;
}
0
Besworks 21 Авг 2018 в 16:22

Вот еще один подход к вашей проблеме

let str = "{[()]}";

function isBalanced(str) {
    const s = str.replace(/[^{}\][()]/, '').split(""),
        codes = {'123': 125,'91': 93,'40': 41};
    if (s.length % 2 !== 0) return 'NO';
    const [first, last] = [s.splice(0, s.length / 2), s];
    return first.every((e,i) => codes[e.charCodeAt(0)] === last[last.length - (i+1)].charCodeAt(0)) ? 'YES' : 'NO'
}

console.log(isBalanced(str));
1
baao 21 Авг 2018 в 15:45

Если вы поместите return внутри функции, эта функция остановится прямо здесь, если она когда-нибудь попадет в эту часть кода, и вернет то, что вы положили в этот оператор возврата, так как вы не даете никакого значения в те return внутри цикла, которые он возвращает undefined.

Вы можете избежать этого, просто удалив эти строки и оставив только один возврат в конце вашего кода:

function isBalanced(s) {
    let brackets = s.split('');
    let balanced = "YES";
    const closedBrackets = ')]}';
    const bracketCompliment = {
        '(' : ')',
        '[' : ']',
        '{' : '}'
    };
    for(let idx = 0; idx < brackets.length; idx++){
        const item = brackets.splice(0, 1)[0];
        if(closedBrackets.includes(item)){
            balanced = "NO";   
        }
        const closeIdx = brackets.indexOf(bracketCompliment[item]);
        const remainder = closeIdx % 2;
        if(closeIdx === -1 || remainder !== 0){
            balanced = "NO";
        } else{
            brackets.splice(closeIdx, 1);
        }
    }
    return balanced;
}

Теперь ваша функция будет ждать завершения цикла и вернет все, что было назначено последним для balanced.

Надеюсь, это поможет.

Примечание. Если вы хотите выйти из цикла, вы можете использовать break вместо return.

1
Guy who types fast 21 Авг 2018 в 15:49

Мое решение:

function isBalanced (str) {
  const obj = {'{': '}', '[': '}', '(': ')'}

  // if (str.length % 2) return 'NO'
  if (obj[str[0]] === str[str.length - 1]) {
    if (str.length === 2) return 'YES'
    return isBalanced(str.slice(1, -1))
  }
  
  return 'NO'
}

console.log(isBalanced('{[(])}'));
console.log(isBalanced('{()}'));
2
Илья Зеленько 21 Авг 2018 в 17:28
51951985