现已知一个字符串是由正整数和加减乘除四个运算符(+ - * /)组成。
例如存在字符串 const str = '11+2-3*4+5/2*4+10/5'
,现在需要将高优先级运算,用小括号包裹起来,例如结果为 '11+2-(3*4)+(5/2*4)+(10/5)'
。注意可能会出现连续的乘除运算,需要包裹到一起。
请用 javascript
实现这一过程
参考答案:
介绍一种只需遍历一次的实现方式,思路比较简单,主要用到了2个临时变量,分别用于记录当前是否在高优先级运算范围和临时值,然后根据不同优先级的运算符进行不同的处理操作。
具体的代码如下:
1function addBrackets(expression) { 2 const resultArr = [] 3 4 // 定义运算符 5 const symbolArr = ['+', '-', '*', '/'] 6 7 // 定义高优先级运算符 8 const highLevelSymbolArr = ['*', '/'] 9 10 // 判断某个字符串是否是运算符 11 const isSymbolFn = (str) => symbolArr.includes(str) 12 13 // 判断某个字符串是否是高优先级运算符 14 const isHighLevelSymbolFn = (str) => highLevelSymbolArr.includes(str) 15 16 // 输入表达式的长度 17 const expLen = expression.length 18 19 // 标记当前的遍历是否处于高优先级运算符范围 20 let isInBracket = false 21 // 记录临时值 22 let currentNum = '' 23 24 for (let i = 0; i < expLen; i++) { 25 const isSymbol = isSymbolFn(expression[i]) 26 const isHighLevelSymbol = isSymbol && isHighLevelSymbolFn(expression[i]) 27 28 // 处理当前字符是运算符的场景 29 if (isSymbol) { 30 //处理当前字符是高优先级运算符 31 if (isHighLevelSymbol) { 32 // 如果当前没有被标记为高优先运算符,就在前面加个括号 33 if (!isInBracket) { 34 currentNum = '(' + currentNum 35 } 36 37 // 修改标记状态 38 isInBracket = true 39 currentNum += expression[i] 40 } else { 41 // 普通运算符 42 43 if (isInBracket) { 44 // 如果之前已经在高优先级运算符范围,就需要标记结束 45 resultArr.push(currentNum + ')') 46 isInBracket = false 47 } else { 48 resultArr.push(currentNum) 49 } 50 resultArr.push(expression[i]) 51 currentNum = '' 52 } 53 } else { 54 // 如果是数字,就直接进行记录 55 currentNum = currentNum + expression[i] 56 } 57 } 58 59 if (currentNum) { 60 resultArr.push(currentNum + (isInBracket ? ')' : '')) 61 } 62 63 return resultArr.join('') 64} 65
另外还可以使用滑动窗口的思路来实现:
有小伙伴提供了一种正则表达式的实现方式,供大家参考:
1let text = '11+2-34+5/24+10/5+10/512'; 2text.match(/([0-9]{1,}[*|/]){1,}[0-9]{1,}/g).forEach((item)=>{ 3 text = text.replace(item,`(${item})`) 4}) 5console.log(text); // '11+2-34+(5/24)+(10/5)+(10/512)'
以上答案由“前端面试题宝典”收集、整理,PC端访问地址: https://fe.ecool.fun/
最近更新时间:2023-03-04