算法:基本计算器【字符串】

基本计算器

Category Difficulty Likes Dislikes
algorithms Hard (36.40%) 126 -
Tags
Companies
实现一个基本的计算器来计算一个简单的字符串表达式的值。

字符串表达式可以包含左括号 ( ,右括号 ),加号 + ,减号 -,非负整数和空格 。

示例 1:

输入: “1 + 1”
输出: 2
示例 2:

输入: " 2-1 + 2 "
输出: 3
示例 3:

输入: “(1+(4+5+2)-3)+(6+8)”
输出: 23
说明:

你可以假设所给定的表达式都是有效的。
请不要使用内置的库函数 eval。

分析

  • 每次遇到左括号’('就进行递归,计算值value,遇到右括号即返回,返回值为value和当前遍历到的位置i。
  • 因此,需要解决的问题就转换为求数的加减
/*
 * @lc app=leetcode.cn id=224 lang=java
 *
 * [224] 基本计算器
 */

// @lc code=start
class Solution {
    public int calculate(String s) {
        char[] chas = s.replaceAll(" ", "").toCharArray();
        return getValue(chas, 0)[0];
        
    }

    public int[] getValue(char[] chas, int index){
        int value = 0;
        int pre = 0;    
        char pre_sym = '+'; //需要判断前一个符号是+/-
        for(int i = index; i < chas.length; i++){
            if(chas[i] == '('){ //左括号则进入循环
                int[] tmp = getValue(chas, i+1);
                //获得的值作为当前遍历的值直接加入到结果中
                value = pre_sym == '+' ? value + tmp[0] : value - tmp[0];
                i = tmp[1];
            }else if(chas[i] == ')'){ //把当前遍历值加入到结果中并返回
                value = pre_sym == '+' ? value + pre : value - pre;
                return new int[]{value, i};
            }else if(chas[i] >='0' && chas[i] <= '9'){//计算当前遍历值
                pre = pre * 10 + chas[i] - '0';
            }else{ //此时chas[i]为+/-
                value = pre_sym == '+' ? value + pre : value - pre;
                pre = 0;
                pre_sym = chas[i];
            }
        }
        //把最后的值加入结果集
        value = pre_sym == '+' ? value + pre : value - pre;
        return new int[]{value, chas.length};
    }
}
// @lc code=end


你可能感兴趣的:(算法)