[路飞]_leetcode 227. 基本计算器 II

145 阅读1分钟

题目描述

leetcode 227. 基本计算器 II

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

示例

示例1:

输入: s = "3+2*2"
输出: 7

示例2:

输入: s = " 3/2 "
输出: 1

示例3:

输入: s = " 3+5 / 2 "
输出: 5

提示:

  • 1 <= s.length <= 3 * 10^5
  • s 由整数和算符 ('+', '-', '*', '/') 组成,中间由一些空格隔开
  • s 表示一个 有效表达式
  • 表达式中的所有整数都是非负整数,且在范围[0, 2^31 - 1]
  • 题目数据保证答案是一个 32-bit 整数

JavaScript实现

/**
 * @param {string} s
 * @return {number}
 */
// 处理不同计算符的级别
function level(opt){
    switch (opt){
        case '@': return -1;
        case '+':
        case '-': return 1;
        case '*':
        case '/': return 2;
    }
    return 0
}
// 计算
function calculation(num1, opt, num2) {
    switch (opt){
        case '*': return num1 * num2;
        case '/': return parseInt(num1 / num2);
        case '+': return num1 + num2;
        case '-': return num1 - num2;
    }
    return 0
}
//3+2-4*2/5
var calculate = function(s) {
    let nums = [], ops = [];
    // 设置一个优先级最低的’@‘; 当执行到@时,前面所有计算符全都运算完成了
    s += '@';
    let n = 0; // n 字符转转数字
    for(let i = 0; i < s.length; i++){
        if(s[i] == ' ') continue; // 处理空字符
        if(level(s[i]) == 0) { // 处理数字序列
            n = n * 10 + (s[i] - 0)
            continue;
        }
        nums.push(n);
        n = 0;
        // 比较计算符优先级,如果ops中的优先级高,就先计算,
        // 否则将现有计算符继续push
        while(ops.length && level(ops[ops.length-1]) >= level(s[i])) {
            let num1 = nums[nums.length -2];
            let num2 = nums[nums.length -1];
            nums.pop();
            nums.pop();
            let res = calculation(num1, ops[ops.length-1], num2);
            nums.push(res);
            ops.pop()
        }
        ops.push(s[i])
    }
    // 计算符序列中是否为空,如果不为空要继续计算; 简化
    // nums.push(n)
    // while(ops.length) {
    //     let num1 = nums[nums.length -2];
    //     let num2 = nums[nums.length -1];
    //     nums.pop();
    //     nums.pop();
    //     let res = calculation(num1, ops[ops.length-1], num2);
    //     nums.push(res);
    //     ops.pop()
    // }
    return nums[0]
};