Я построил функцию, которая возвращает "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;
}
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('{()}'));
Вы возвращаете значение 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;
}
Вот еще один подход к вашей проблеме
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));
Если вы поместите 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
.
Мое решение:
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('{()}'));
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.