[英]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
来存储左括号。 下面是一个简单的解释:
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.