分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击人工智能教程

package live.every.day.ProgrammingDesign.CodingInterviewGuide.String;import java.util.Deque;
import java.util.LinkedList;/*** 公式字符串求值** 【题目】* 给定一个字符串str,str表示一个公式,公式里可能有整数、加减乘除符号和左右括号,返回公式的计算结果。** 【说明】* 1.可以认为给定的字符串一定是正确的公式,即不需要对str做公式有效性检查。* 2.如果是负数,就需要用括号括起来,比如"4*(-3)"。但如果负数作为公式的开头或括号部分的开头,则可以没有括号,比如* "-3*4"和"(-3*4)"都是合法的。* 3.不用考虑计算过程中会发生溢出的情况。** 【难度】* 困难** 【解答】* 本题考查面试者设计程序和代码实现的能力,实现方式有很多,本文提供一种方法供读者参考。假设value方法是一个递归过程,具体* 解释如下。** 从左到右遍历str,开始遍历或者遇到字符'('时,就进行递归过程。当发现str遍历完,或者過到字符')'时,递归过程就结束。比如* "3*(4+5)+7",一开始遍历就进入递归过程value(str,0),在递归过程value(str,0)中继续遍历str,当遇到字符'('时,递归* 过程value(str,0)又重复调用递归过程value(str,3)。然后在递归过程value(str,3)中继续遍历str,当遇到字符')'时,递* 归过程value(str,3)结束,并向递归过程value(str,0)返回两个结果,第一结果是value(str,3)遍历过的公式字符子串的结果,* 即"4+5"==9,第二个结果是value(str,3)遍历到的位置,即字符")"的位置==6。递归过程value(str,0)收到这两个结果后,既* 可知道交给value(str,3)过程处理的宇符串结果是多少("(4+5)"的结果是9),又可知道自己下一步该从什么位置继续遍历(该从位* 置6的下一个位置(即位置7)继续遍历)。总之,value方法的第二个参数代表递归过程是从什么位置开始的,返回的结果是一个长度为* 2的数组,记为res。res[O]表示这个递归过程计算的结果,res[1]表示这个递归过程遍历到str的什么位置。** 既然在递归过程中遇到'('就交给下一层的递归过程处理,自己只用接收'('和')'之间的公式字符子串的结果,所以对所有的递归过* 程来说,可以看作计算的公式都是不含有'('和')'字符的。比如,对递归过程value(str,0)来说,实际上计算的公式是"3*9+7",* "(4+5)"的部分交给递归过程value(str,3)处理,拿到结果9之后,再从字符'+'继续。所以,只要想清楚如何计算一个不含有'('* 和')'的公式字符串,整个实现就完成了。** 全部过程请参看如下代码中的getValue方法。** @author Created by LiveEveryDay*/public class FormulaStringEvaluation {public static int getValue(String exp) {return value(exp.toCharArray(), 0)[0];}private static int[] value(char[] chars, int i) {Deque<String> deq = new LinkedList<>();int pre = 0;int[] bra = null;while (i < chars.length && chars[i] != ')') {if (chars[i] >= '0' && chars[i] <= '9') {pre = pre * 10 + chars[i++] - '0';} else if (chars[i] != '(') {addNum(deq, pre);deq.addLast(String.valueOf(chars[i++]));pre = 0;} else {bra = value(chars, i + 1);pre = bra[0];i = bra[1] + 1;}}addNum(deq, pre);return new int[]{getNum(deq), i};}private static void addNum(Deque<String> deq, int num) {if (!deq.isEmpty()) {int cur = 0;String top = deq.pollLast();if (top.equals("+") || top.equals("-")) {deq.addLast(top);} else {cur = Integer.parseInt(deq.pollLast());num = top.equals("*") ? (cur * num) : (cur / num);}}deq.addLast(String.valueOf(num));}private static int getNum(Deque<String> deq) {int res = 0;boolean add = true;String cur = null;int num = 0;while (!deq.isEmpty()) {cur = deq.pollFirst();if (cur.equals("+")) {add = true;} else if (cur.equals("-")) {add = false;} else {num = Integer.parseInt(cur);res += add ? num : (-num);}}return res;}public static void main(String[] args) {String exp = "48*((70-65)-43)+8*1";System.out.printf("The evaluation result is: %d", getValue(exp));}}// ------ Output ------
/*
The evaluation result is: -1816
*/

【困难】公式字符串求值-Java相关推荐

  1. 行列式求值Java语言实现———线性代数

    目录 前言 一.对行列式的某行或某列进行操作 二.缩小矩阵的大小 三.正负号处理和值存储之后进行除法运算 四.代码使用过程 五.整体代码 前言 行列式求值对于刚刚学习完线性代数的大学生再熟悉不过了,同 ...

  2. 算术表达式字符串求值

    问题: 计算字符串"10+12*13-30/20"的值 思路: 第一步:从左到右解析字符串,将数值与运算符放入数组 第二步:先计算乘除法,将求值放入队列 第三步:依次出队列,计算最 ...

  3. 逆波兰式求值 —Java

    首先我们了解一下什么叫逆波兰表达式? 逆波兰式,也叫后缀表达式(即运算符写在操作数之后) 例: 9 3 / 而我们日常所用的表达式都是中缀表达式,与逆波兰式是不一样的 上述的逆波兰式可能大家已经知道了 ...

  4. java获取字符串hash值,Java 获取字符串Hash值

    import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class TEST ...

  5. 中缀表达式求值 Java

    什么是中缀表达式: 中缀表达式的计算逻辑: 例:(10+20/2*3)/2+8 我们要按照四则运算的逻辑进行计算: (1)先计算括号内的计算单元,而内部的计算单元必须要按照四则运算的优先级来进行即先乘 ...

  6. java求值不用后缀表达式_数据结构之后缀表达式求值(java实现)

    数据结构之后缀表达式求值(java实现) 前记 ​ 今天在刷leet code的时候刷到了一道题,后缀表达式(逆波兰表达式)求值,我花了一会儿写了一下它的解法.但是今天我不谈什么是后缀表达式,有兴趣的 ...

  7. 蓝桥杯-组合公式求值(java)

    算法提高 组合公式求值 时间限制:1.0s 内存限制:256.0MB问题描述给定n, m,求:输入格式输入一行,包含两个整数n, m.输出格式输出一行,包含求得的值,由于答案可能非常大,请输出此公式除 ...

  8. Java 计算数学表达式(字符串解析求值工具)

    Java字符串转换成算术表达式计算并输出结果,通过这个工具可以直接对字符串形式的算术表达式进行运算,并且使用非常简单. 这个工具中包含两个类 Calculator 和 ArithHelper Calc ...

  9. java实现第四届蓝桥杯公式求值

    公式求值 输入n, m, k,输出图1所示的公式的值.其中C_n^m是组合数,表示在n个人的集合中选出m个人组成一个集合的方案数.组合数的计算公式如图2所示. 输入的第一行包含一个整数n:第二行包含一 ...

最新文章

  1. 这10项机器人领域的核心技术,你了解多少
  2. [20171124]手工使用Seed_Database.dfb和Seed_Database.ctl建库.txt
  3. python中递归函数特点,Python递归函数特点及原理解析
  4. Linux下的vim编辑器与gcc编译器及静动态库的制作
  5. MAC 安装 xctool 遇到的问题
  6. 全员5G!iPhone 12系列终于来了:没有阉割,售价依旧5499元起!
  7. 去除Vue在WebStorm中报命名空间的错误
  8. Android UI学习之EditText
  9. 【公司内部资料】顺丰新员工入职考试35道考试题目答案
  10. 免费的自媒体原创度检测工具有哪些?快速帮你提高系统推荐
  11. 万达电商为何刻意回避阿里与马云
  12. 全向轮算法/万向轮算法/福来轮算法/全向轮漂移算法/万向轮漂移算法/福来轮漂移算法
  13. 领英工具领英精灵批量加人有哪些方法
  14. Connecting to 192.168.237.129:22... Could not connect to '192.168.237.129' (port 22): Connection fai
  15. Hashtable简述
  16. 《机器人构建实战》——1.4 典型机器人
  17. 5G网络安全方案-华为
  18. 还在每天standup会议吗?是时候尝试这个了。。。
  19. linux服务器套件,TheSSS 23.1维护更新,轻量级服务器套件
  20. 浅谈入侵检测技术4(snort简介)

热门文章

  1. 快乐爪洼_JavaSE_基础语法,面向对象,异常处理,多线程
  2. 承诺书合同的效力是怎样的
  3. windows 电脑常用快捷键
  4. 利用excel更换证件照背景色
  5. SAP ABAP BADI ACC_DOCUMENT创建财务凭证扩展字段增强
  6. uC/OS任务创建函数OSTaskCreate ()参数详解
  7. unity3d 大地图接壤_如何使用Unity自带的TileMap做出六边形地图
  8. 服务器2008怎么打开隐藏文件,win2008隐藏指定的磁盘
  9. 苹果手机时区改不了怎么办_iPhone无法手动修改时间怎么办?关闭这个功能就能解决问题了!...
  10. Centos7 安装Redis详细教程