繁体   English   中英

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

[英]How to check the expression is correct or not in javascript in sample of test cases?

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


(a) correct

((a)) correct

(a(b)) correct

(b) correct

(b  incorrect

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

链接中略有编辑的答案

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

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

 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])); }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM