请写一个整数计算器,支持加减乘三种运算和括号。
数据范围:,保证计算结果始终在整型范围内
要求:空间复杂度: ,时间复杂度
非常好懂的,有注释喔
function solve(s) { // write code here let ops = []; // 用来存储运算符 let nums = []; // 用来存储数值和每次计算的结果 // console.log(isNaN(parseInt(s[0]))); for (let i = 0; i < s.length; i++) { if('(*'.indexOf(s[i]) > -1) { // 判断 s[i] 是否为 ( 和 * ops.push(s[i]) // 是就入栈 } else if(!isNaN(s[i])) { // 判断是否为 一个数字 ->number let temp = '' // 临时变量 while(i<s.length && !isNaN(s[i])) { temp = temp + s[i++] // 因为 s 给的是一个字符串 所以通过这个办法 可以把 两位数的数字拼在一起 } i-- // 如果 s[0] 和 s[1] 是一个操作数值12 经过上面的操作拼完了之后 i 会等于2 所以这里等让 i - 1 变回1 指向s[1] nums.push(parseInt(temp)) // 随后入栈 } else if(s[i] == '+' || s[i] == '-') { // 如果是加号 或者 减号 while(ops.length > 0 && '*+-'.indexOf(ops[ops.length - 1]) > -1) { // 就将 ops数组里 //的 * + - 等运算符 pop 出去进行操作 let num1 = nums.pop() let num2 = nums.pop() let res = calc(ops.pop(), num1, num2) // 加减乘 操作函数 在下面 nums.push(res) // 将得出的结果入栈 , 如果你有疑问, 为什么最后栈中的就一顶只有结果,没有别的操作数字, 因为 // 上面 num1 和 num2 赋值的时候 都 pop出去了 } ops.push(s[i]) // 最后将 此次遇到的 + 号丢进栈里 } else if(s[i] == ')') { // 如果遇到 ) while(ops.length > 0 && ops[ops.length - 1] != '(') { // 只要栈不空, 和不遇到 ( // 就一直循环 let num1 = nums.pop() let num2 = nums.pop() let res = calc(ops.pop(), num1, num2) // 思想和上面一样 nums.push(res) // 结果入栈 } ops.pop() // 把左括号丢出去 } } while(ops.length > 0) { // 最后 ops 不空 不停 let num1= nums.pop() let num2 = nums.pop() let temp_res = calc(ops.pop(), num1, num2) nums.push(temp_res) // 最后的结果 丢进去 } return nums.pop() // 最后的结果 return 出去 } function calc(op ,b ,a) { if(op == '+') return a + b if(op == '-') return a - b if(op == '*') return a * b return 0 } module.exports = { solve: solve, };
/** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ function solve(s) { // write code here let index = 0; let index2 = 0; while (s.includes("(")) { index = s.indexOf(")"); index2 = s.slice(0, index).lastIndexOf("("); s = s.slice(0, index2) + calc(s.slice(index2 + 1, index)) + s.slice(index + 1); } return Number(calc(s)); function calc(string) { const progress = []; let temp = 0; let index = 1; while (!Number(string)) { while (!"+-*".includes(string.charAt(index))) { index++; } progress.push(string.slice(0, index)); progress.push(string.charAt(index)); string = string.slice(index + 1); index = 1; } progress.push(string); while (progress.length > 1) { if (progress.includes("*")) { index = progress.indexOf("*") - 1; temp = progress[index] * progress[index + 2]; progress.splice(index, 3, temp); continue; } if (progress.includes("+")) { index = progress.indexOf("+") - 1; temp = Number(progress[index]) + Number(progress[index + 2]); progress.splice(index, 3, temp); continue; } if (progress.includes("-")) { index = progress.indexOf("-") - 1; temp = progress[index] - progress[index + 2]; progress.splice(index, 3, temp); continue; } } return progress[0]; } } module.exports = { solve: solve, };
function solve(s) { // write code here // return new Function(`return ${s}`)() //注意所有加减乘除都要算上前面的括号。 const helper = function (str) { //先匹配()因为括号里面先算 var kuohao = str.match(/\(([^)(]+)\)/); if (kuohao && kuohao[1]) { let ret = helper(kuohao[1]); return helper(str.replace(`(${kuohao[1]})`, ret)); } var chenhao = str.match(/([-]?\d+)\*([-]?\d+)/); if (chenhao && chenhao[1] && chenhao[2]) { let ret = helper(chenhao[1]) * helper(chenhao[2]); return helper(str.replace(chenhao[0], ret)); } var chuhao = str.match(/([-]?\d+)\/([-]?\d+)/); if (chuhao && chuhao[1] && chuhao[2]) { let ret = helper(chuhao[1]) * helper(chuhao[2]); return helper(str.replace(ret[0], ret)); } var jia = str.match(/([-]?\d+)\+([-]?\d+)/); if (jia && jia[1] && jia[2]) { let ret = helper(jia[1]) + helper(jia[2]); return helper(str.replace(jia[0], ret)); } var jian = str.match(/([-]?\d+)\-([-]?\d+)/); if (jian && jian[1] && jian[2]) { const ret = helper(jian[1]) - helper(jian[2]); return helper(str.replace(jian[0], ret)); } return parseInt(str); } let result = helper(s) return result; }
天才的解法 /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * 返回表达式的值 * @param s string字符串 待计算的表达式 * @return int整型 */ function solve( s ) { return eval(s) } module.exports = { solve : solve };
function solve( s ) { // write code here return ~~eval(s) }