我的代码只有在块按特定顺序排列时才有效
My code only works if blocks are in a certain order
我正在 Javascript 中编写一个函数来检查字符串参数是否有平衡括号。
平衡括号:
- 如果一个字符串具有与给定类型的右括号一样多的给定类型的左括号,则该字符串被认为是平衡的。
- 没有一个括号是不匹配的。右括号也不能匹配其后相应的左括号。
- 括号也不能相互重叠。
该函数遍历给定的字符串并检查每个括号类型 ()、[]、{},以查看是否存在正确的一对。
该方法是遍历字符串以检查左括号,如果找到,则遍历字符串的其余部分以查找相应的右括号,然后删除该对。每个代码块都对每种不同的括号类型执行此操作。最后,如果有任何杂散的右括号或左括号,它将 return false,否则它将 return true。
在 运行 我的代码在一串平衡括号 ({[]}) 上测试后,我发现它只有在我检查括号时才有效按照它们在字符串中出现的顺序。我不确定为什么这些块的顺序会影响它的工作方式。用“else if”而不是“if”连接条件句没有任何影响。
function hasBalancedBrackets(string) {
var stringArray = string.split('');
for (var i = 0; i < stringArray.length; i++) {
if (stringArray[i] === '(') {
for (var j = i+1; j < stringArray.length; j++) {
if (stringArray[j] === ')') {
stringArray.splice(i, 1);
stringArray.splice(stringArray.indexOf(')'), 1);
break;
}
}
}
if (stringArray[i] === '{') {
for (var l = i+1; l < stringArray.length; l++) {
if (stringArray[l] === '}') {
stringArray.splice(i, 1);
stringArray.splice(stringArray.indexOf('}'), 1);
break;
}
}
}
if (stringArray[i] === '[') {
for (var k = i+1; k < stringArray.length; k++) {
if (stringArray[k] === ']') {
stringArray.splice(i, 1);
stringArray.splice(stringArray.indexOf(']'), 1);
break;
}
}
}
}
console.log('stringArray:', stringArray); // to check that all the bracket pairs have been removed
if (stringArray.indexOf('(') === -1 && stringArray.indexOf('[') === -1 && stringArray.indexOf('{') === -1 && stringArray.indexOf(')') === -1 && stringArray.indexOf(']') === -1 && stringArray.indexOf('}') === -1) {
return true;
} else {
return false;
}
}
// Assertion functions and test suite
function assertEqual(actual, expected, testName) {
if (actual === expected) {
console.log(`Passed [${testName}]`);
} else {
console.log(`FAILED [${testName}] Expected "${expected}", but got "${actual}"`);
}
}
// tests
// input has balanced brackets, part 2
var actual4 = hasBalancedBrackets('({[]})');
assertEqual(actual4, true, 'Returns true when input string has balanced brackets');
代码块的顺序和对函数的影响:
- {}, (), [] - 失败,找不到大括号 {}
- {}, [], () - 失败,找不到大括号 {}
- [], {}, () - 失败,找不到大括号 {}
- [], (), {} - 失败,找不到方括号 []
- (), [], {} - 失败,找不到方括号 []
- (), {}, [] - 通过
最外层的 for
块递增索引 i 但内部代码从数组中删除元素。因此,如果内部代码从数组中删除任何内容,当外部循环再次为 运行 时,它会跳过新的第一个元素。
{}()[]
第一个 运行 外循环删除 {} 和 []
现在 stringArray 是 ()
外循环的第二个 运行 现在从索引 1 开始,即 ),因此它找不到该对。
我正在 Javascript 中编写一个函数来检查字符串参数是否有平衡括号。
平衡括号:
- 如果一个字符串具有与给定类型的右括号一样多的给定类型的左括号,则该字符串被认为是平衡的。
- 没有一个括号是不匹配的。右括号也不能匹配其后相应的左括号。
- 括号也不能相互重叠。
该函数遍历给定的字符串并检查每个括号类型 ()、[]、{},以查看是否存在正确的一对。 该方法是遍历字符串以检查左括号,如果找到,则遍历字符串的其余部分以查找相应的右括号,然后删除该对。每个代码块都对每种不同的括号类型执行此操作。最后,如果有任何杂散的右括号或左括号,它将 return false,否则它将 return true。
在 运行 我的代码在一串平衡括号 ({[]}) 上测试后,我发现它只有在我检查括号时才有效按照它们在字符串中出现的顺序。我不确定为什么这些块的顺序会影响它的工作方式。用“else if”而不是“if”连接条件句没有任何影响。
function hasBalancedBrackets(string) {
var stringArray = string.split('');
for (var i = 0; i < stringArray.length; i++) {
if (stringArray[i] === '(') {
for (var j = i+1; j < stringArray.length; j++) {
if (stringArray[j] === ')') {
stringArray.splice(i, 1);
stringArray.splice(stringArray.indexOf(')'), 1);
break;
}
}
}
if (stringArray[i] === '{') {
for (var l = i+1; l < stringArray.length; l++) {
if (stringArray[l] === '}') {
stringArray.splice(i, 1);
stringArray.splice(stringArray.indexOf('}'), 1);
break;
}
}
}
if (stringArray[i] === '[') {
for (var k = i+1; k < stringArray.length; k++) {
if (stringArray[k] === ']') {
stringArray.splice(i, 1);
stringArray.splice(stringArray.indexOf(']'), 1);
break;
}
}
}
}
console.log('stringArray:', stringArray); // to check that all the bracket pairs have been removed
if (stringArray.indexOf('(') === -1 && stringArray.indexOf('[') === -1 && stringArray.indexOf('{') === -1 && stringArray.indexOf(')') === -1 && stringArray.indexOf(']') === -1 && stringArray.indexOf('}') === -1) {
return true;
} else {
return false;
}
}
// Assertion functions and test suite
function assertEqual(actual, expected, testName) {
if (actual === expected) {
console.log(`Passed [${testName}]`);
} else {
console.log(`FAILED [${testName}] Expected "${expected}", but got "${actual}"`);
}
}
// tests
// input has balanced brackets, part 2
var actual4 = hasBalancedBrackets('({[]})');
assertEqual(actual4, true, 'Returns true when input string has balanced brackets');
代码块的顺序和对函数的影响:
- {}, (), [] - 失败,找不到大括号 {}
- {}, [], () - 失败,找不到大括号 {}
- [], {}, () - 失败,找不到大括号 {}
- [], (), {} - 失败,找不到方括号 []
- (), [], {} - 失败,找不到方括号 []
- (), {}, [] - 通过
最外层的 for
块递增索引 i 但内部代码从数组中删除元素。因此,如果内部代码从数组中删除任何内容,当外部循环再次为 运行 时,它会跳过新的第一个元素。
{}()[]
第一个 运行 外循环删除 {} 和 []
现在 stringArray 是 ()
外循环的第二个 运行 现在从索引 1 开始,即 ),因此它找不到该对。