请写一个整数计算器,支持加减乘三种运算和括号。
数据范围:
,保证计算结果始终在整型范围内
要求:空间复杂度:
,时间复杂度
非常好懂的,有注释喔
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)
}