【LeetCode】Basic Calculator II
Basic Calculator II
问题描述
Implement a basic calculator to evaluate a simple expression string.
The expression string contains only non-negative integers, +, -, *, / operators and empty spaces . The integer division should truncate toward zero.
You may assume that the given expression is always valid.
Some examples:
“3+2*2” = 7
” 3/2 ” = 1
” 3+5 / 2 ” = 5
Note: Do not use the eval built-in library function.
意:实现字符串数学表达式的计算
算法思想
算法使用双向链表两次扫描计算(虽然不是最好的,但是思想很单纯,后续我会改进该算法,现在懒得动)
第一遍 计算 * 和 /
第二遍 计算 + 和 -
第一遍扫描,扫描字符串:
- 如果当前是数字,查看队列末尾是否为*或者/,如果是就计算当前数字和队列尾第二个数的结果,并加入队列。
- 如果当前是符号,直接加入队列末尾。
- 当第一遍扫描结束队列中剩下的就是数字和+ 、-
第二遍扫描,从头扫描队列
- 如果下一个是符号,移除并根据符号再获取下一个数值,计算结果加入队列头。
算法实现
import java.util.LinkedList;public class Solution {public static int calculate(String s) {LinkedList<Integer> linkedList = new LinkedList<Integer>();char[] characters = s.toCharArray();char c = ' ';int k = 0;for (int i = 0; i < characters.length; i++) {c = characters[i];k = 0;if (Character.isDigit(c)) {//获取while (Character.isDigit((c = characters[i++]))) {k = (c - 48) + k * 10;if (i == characters.length)break;}//如果上一个符号为*或者/,则计算上一个数值与当前数值的操作结果if (!linkedList.isEmpty()) {if (linkedList.getLast().intValue() == 42) {linkedList.removeLast();k = linkedList.removeLast() * k;} else if (linkedList.getLast().intValue() == 47) {linkedList.removeLast();k = linkedList.removeLast() / k;}}//记录当前数值到队列中linkedList.add(k);}//如果下一个操作是+或者-,加入队列,等待下一次遍历进行计算if (i < characters.length) {if (c != ' ')linkedList.add((int) c);i--;}}int result = 0;while (!linkedList.isEmpty()) {result = linkedList.removeFirst();if (!linkedList.isEmpty()) {int op = linkedList.removeFirst().intValue();if (op == 43) {result += linkedList.removeFirst();} else {result -= linkedList.removeFirst();}linkedList.addFirst(result);}}return result;}
}
算法时间
O(n)
演示结果
public static void main(String[] args) {System.out.println(calculate("100+1000*1+1000/10"));}
1200
【LeetCode】Basic Calculator II相关推荐
- LeetCode OJ Basic Calculator II
Basic Calculator II 题目 思路 和这个一样:Basic Calculator I 代码 class ExpressionTransformation { public:string ...
- 【Leetcode】213. 打家劫舍II(House Robber II)
Leetcode - 213 House Robber II (Medium) 题目描述:一个小偷沿着一条环形的街偷窃,给定数组表示每家屋子的金额,如果偷窃连续的两间屋子就会触发警报,求在不触发警报的 ...
- leetcode 227. Basic Calculator II | 227. 基本计算器 II(中缀表达式求值)
题目 https://leetcode.com/problems/basic-calculator-ii/ 题解 这道题是 中缀表达式求值 的简化版(因为没有左右括号运算),不过输入的形式有两个处理起 ...
- 【LeetCode】275. H-Index II 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/h-index- ...
- 【leetcode】Path Sum II
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- 【LeetCode】字符串 string(共112题)
[3]Longest Substring Without Repeating Characters (2019年1月22日,复习) [5]Longest Palindromic Substring ( ...
- 【leetcode】解题日记(未完待续)
开坑,有生之年系列,希望有一天能解出 leetcodeleetcodeleetcode 上的所有题目. 写题解好麻烦,懒得写(手动狗头),进度如下,不定期更新. 总题数 已解答 题解数 2058 23 ...
- 【LeetCode】【HOT】240. 搜索二维矩阵 II(抽象二叉搜索树)
[LeetCode][HOT]240. 搜索二维矩阵 II 文章目录 [LeetCode][HOT]240. 搜索二维矩阵 II package hot;public class Solution24 ...
- 【LeetCode】【HOT】142. 环形链表 II(快慢指针)
[LeetCode][HOT]142. 环形链表 II 文章目录 [LeetCode][HOT]142. 环形链表 II package hot;class ListNode{int val;List ...
最新文章
- OpenCV 笔记(01)— OpenCV 概念、整体架构、各模块主要功能
- Windows7/10上快速搭建Tesseract-OCR开发环境操作步骤
- iOS架构-静态库.a之依赖第三方静态库.a的制作(8)
- java解析json_JAVA解析JSON数据
- 休眠:DDL模式生成
- python遇到对象_### python面对对象小汇总 #####
- 4.3定时器框架(Timer Framework)
- oracle 中execute immediate 是什么意思?
- 物联网可视化平台-场景编辑器-轻松实现三维地图搭建
- 怎么用数学绘图软件验证扇形面积公式?
- 用Python实现随机森林回归
- 校园二手市场需求分析
- 利用FME对坐标文件进行坐标转换
- 怎么释放mysql连接_数据库连接释放问题
- ORA-28001: the password has expired解决
- 如何搭建一个自己的私有云盘
- linux桌面网络连接是个X,Xbrowser如何运行多个X桌面
- 三色旗java_经典算法-(四)三色旗
- Linux下的32位C程序,linux系统c语言生成.so文件,生成64位可执行文件,在64位系统中运行32位的可执行文件...
- OpenCV打开摄像头《大华摄像头》