如何在测试用例示例中检查javascript中的表达式是否正确



我有以下测试用例,其中我需要用javascript对正确的表达式进行分类。


(a) correct
((a)) correct
(a(b)) correct
(b) correct
(b  incorrect

你可以看到最后一个是不正确的表达。我们如何通过javascript实现这一点?

处理其他类型的括号-{}、[]和((:

function matchBrackets(s) {
let x = "";
let c = [];
let ok = true;
for (let i = 0; i < s.length; i++) {
x = s.substr(i, 1);
switch (x) {
case "{":
c.unshift("}");
break;
case "[":
c.unshift("]");
break;
case "(":
c.unshift(")");
break;
case "}":
if (c[0] == "}") {
c.shift();
} else {
ok = false;
}
break;
case "]":
if (c[0] == "]") {
c.shift();
} else {
ok = false;
}
break;
case ")":
if (c[0] == ")") {
c.shift();
} else {
ok = false;
}
break;
}
if (!ok) {
break;
}
}
if (c.length > 0) {
ok = false;
}
return ok;
} 
let tocheck = [];
tocheck.push("a(b][}c");
tocheck.push("a(bc");
tocheck.push("a)(bc");
tocheck.push("a(b)[c]{(d)}");
tocheck.push("(a)");
tocheck.push("((a))");
tocheck.push("(a(b))");
tocheck.push("(b)");
tocheck.push("(b");
tocheck.push("))a((");
for (let i = 0; i < tocheck.length; i++) {
console.log(tocheck[i] + ": " + matchBrackets(tocheck[i]));
}

这与其他方法类似,但确保任何类型的右括号都必须与同一类型的最后一个左括号匹配。

这个链接的一个经过轻微编辑的答案

function check(expr){
const holder = []
const openBrackets = ['(']
const closedBrackets = [')']
for (let letter of expr) { // loop trought all letters of expr
if(openBrackets.includes(letter)){ // if its oppening bracket
holder.push(letter)
}else if(closedBrackets.includes(letter)){ // if its closing
const openPair = openBrackets[closedBrackets.indexOf(letter)] // find his pair
if(holder[holder.length - 1] === openPair){ // check if that pair is last element in array
holder.splice(-1,1) //if so, remove it
}else{ // if its not
holder.push(letter)
break // exit loop
}
}
}
if(holder.length === 0)
{
console.log("correct");
}
else{
console.log("incorrect");
}
}
check('(a)') /// give the string you want to check here

您需要使用一个简单的stack来存储左括号。这里有一个简单的解释:

  1. 将字符串转换为字符数组
  2. 创建一个空堆栈
  3. 遍历每个字符:
    • 如果字符不是圆括号,则继续下一次迭代
    • 如果是左括号,请将其存储在堆栈中
    • 如果它是一个右括号,那么有两种可能性:
      • 如果堆栈中没有对应的左括号,则该字符串无效
      • 如果有,则弹出相应的对括号并正常继续

let t1 = '(a)', t2 = '((b))', t3 = '(a(b))', t4 = '(b';
const isValid = (str) => {
let characters = str.split('');
let stack = [];
for(let i = 0; i < characters.length; i++){
let c = characters[i];
if(c !== '(' && c !== ')') 
continue;
else if(c === '(')
stack.push(c);
else if(c === ')'){
if(stack.length==0)
return false;
else
stack.pop();
}
}
return stack.length==0;
}
console.log(isValid(t1));
console.log(isValid(t2));
console.log(isValid(t3));
console.log(isValid(t4));

如果他们想检查字符串,那么我只需要在字符串上循环。我会有一个变量(characterCount(,它为每个"("字符加一,为每个"("减一。如果最终结果是0,那么它的格式是正确的。

编辑:我还需要检查characterCount是否为负数,这意味着格式不正确。


如果是面试,请他们澄清。提出要求的程序员比假设的程序员更有价值(并花费数小时的宝贵时间编码错误的功能(。

function checkFormatting(str) {
const END_CHARACTER_BEFORE_START_CHARACTER = CORRECT_FORMATTING = 0;
let characterCount = CORRECT_FORMATTING;
let startCharacter = '(';
let endCharacter = ')';

for(let i = 0; i < str.length; i++) {
characterCount += Number(str[i] == startCharacter); // +1 if true
characterCount -= Number(str[i] == endCharacter);   // -1 if false
if (characterCount < END_CHARACTER_BEFORE_START_CHARACTER) { // EDIT
console.log(str, false);
return false;
}
}
console.log(str, characterCount == CORRECT_FORMATTING);
return characterCount == CORRECT_FORMATTING;
}
checkFormatting('(a)');    // true
checkFormatting('((a))');  // true
checkFormatting('(a(b))'); // true
checkFormatting('(b)');    // true
checkFormatting('(b');     // false
checkFormatting('))a((');  // false

最新更新