2021-05-23:给定一个字符串str,str表示一个公式,公式里可能有整数、加减乘除符号和左右括号。返回公式的计算结果,难点在于括号可能嵌套很多层。str=“48*((70-65)-43)+81",返回-1816。str="3+14”,返回7。str=“3+(14)",返回7。【说明】 1.可以认为给定的字符串一定是正确的公式,即不需要对str做公式有效性检查。2.如果是负数,就需要用括号括起来,比如“4(-3)”但如果负数作为公式的开头或括号部分的开头,则可以没有括号,比如”-34"和"(-34)"都是合法的。 3.不用考虑计算过程中会发生溢出的情况。

福大大 答案2021-05-23:

栈。对于递归函数。遇到左括号,递归调用;遇到右括号或者终止位置,终止。递归函数需要返回计算后的结果和终止位置。

代码用golang编写。代码如下:

package main

import (
"container/list"
"fmt"
"strconv"
) func main() {
ret := calculate("(1+2/2)*3")
fmt.Println(ret)
} func calculate(str string) int {
return f(str, 0).Val
} type RetInfo struct {
Val int
Index int
} // 请从str[i...]往下算,遇到字符串终止位置或者右括号,就停止
// 返回两个值,长度为2的数组
// 0) 负责的这一段的结果是多少
// 1) 负责的这一段计算到了哪个位置
func f(str string, i int) *RetInfo { que := list.New().Init()
cur := 0
var bra *RetInfo
// 从i出发,开始撸串
for i < len(str) && str[i] != ')' {
if str[i] >= '0' && str[i] <= '9' {
cur = cur*10 + int(str[i]-'0')
i++
} else if str[i] != '(' { // 遇到的是运算符号
addNum(que, cur)
que.PushBack(fmt.Sprintf("%c", str[i]))
i++
cur = 0
} else { // 遇到左括号了
bra = f(str, i+1)
cur = bra.Val
i = bra.Index + 1
}
}
addNum(que, cur)
return &RetInfo{Val: getNum(que), Index: i}
} func addNum(que *list.List, num int) {
if que.Len() > 0 {
cur := 0
top := que.Back().Value.(string)
que.Remove(que.Back())
if top == "+" || top == "-" {
que.PushBack(top)
} else {
cur, _ = strconv.Atoi(que.Back().Value.(string))
que.Remove(que.Back())
if top == "*" {
num = cur * num
} else {
num = cur / num
}
}
}
que.PushBack(fmt.Sprintf("%d", num))
} func getNum(que *list.List) int {
res := 0
add := true
var cur string
num := 0
for que.Len() > 0 {
cur = que.Front().Value.(string)
que.Remove(que.Front())
if cur == "+" {
add = true
} else if cur == "-" {
add = false
} else {
num, _ = strconv.Atoi(cur)
if add {
res += num
} else {
res -= num
}
}
}
return res
}

执行结果如下:


左神java代码

2021-05-23:给定一个字符串str,str表示一个公式,公式里可能有整数、加减乘除符号和左右括号。返回公式的计算结果,难点在于括号可能嵌套很多层。str=“48*((70-65)-43)+8*的更多相关文章

  1. ES6--javascript判断一个字符串是否存在另一个字符串中

    es5中我们经常使用indexof()方法来判断一个字符串是否包含另外一个字符串中. 如果存在则返回匹配到的第一个索引值.如果没有则返回 -1.所以,判断一个字符串是否包含另外一个字符串中只需要判断是 ...

  2. java集合TreeMap应用---求一个字符串中,每一个字母出现的次数

    package cn.itcast.p1.map.test; import java.util.Iterator; import java.util.Map; import java.util.Tre ...

  3. JavaScript 判断一个字符串是否在另一个字符串中

    传统上,JavaScript只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中.ES6又提供了三种新方法. includes():返回布尔值,表示是否找到了参数字符串. start ...

  4. 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。 给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。

    // 第一种方法 // ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include < ...

  5. mysql如何判断一个字符串是否包含另外一个字符串?

    转自:http://blog.csdn.net/hechurui/article/details/49278493 判断子字符串在父字符串当中的索引: SELECT LOCATE("b&qu ...

  6. jQuery判断一个字符串中是否包含一个字符串(一)

    var key = 'java'; var str = "hello,javascript,welcome to my world"; if(key.indexOf(str)!=- ...

  7. 【LintCode】判断一个字符串是否包含另一个字符串的所有字符

    问题描述: 比较两个字符串A和B,确定A中是否包含B中所有的字符.字符串A和B中的字符都是 大写字母. 样例 给出 A = "ABCD" B = "ACD",返 ...

  8. [LintCode]判断一个字符串是否包含另一个字符串的所有字符

    问题描述: 比较两个字符串A和B,确定A中是否包含B中所有的字符.字符串A和B中的字符都是 大写字母. 样例 给出 A = "ABCD" B = "ACD",返 ...

  9. java中如何判断一个字符串是否包含另外一个字符串的方法

    indexOf(String s)的使用,如果包含,返回的值是包含该子字符串在父类字符串中起始位置: 如果不包含必定全部返回值为-1 package my_automation; public cla ...

  10. js 经典正则判断 一个字符串是否包含另一个字符串

    if (!new RegExp(list_table[i].value.split("—")[0]).test(lhtj)) { }判断在lhtj中是否包含list_table[i ...

随机推荐

  1. Ipmitool命令之ipmitool user(用户管理)

    常见的用户配置命令: (1)查看用户清单 root@master:~# ipmitool user list 1 ID Name Callin Link Auth IPMI Msg Channel P ...

  2. Linux & 标准C语言学习 <DAY2>

    vim文本编辑器:     可以直接在终端下采用纯键盘操作的一款文本编辑器,号称编辑器之神,可以二次升级.可以扩展     基础用法:         1.进入vim:             输入 ...

  3. 基于 HLS 创建 Golang 视频流服务器

    HLS 是 HTTP Live Streaming 的缩写,是苹果开发的一种基于 HTTP 的自适应比特率流媒体传输协议, 并于 2009 年. HLS 流媒体已经成为应用最广泛的实时视频协议.它是一 ...

  4. 关于 manacher 的一个小细节

    在该算法中,我们需要用到一个数组 hw[i] ,代表 i 的最大回文半径.而且这个半径不包括 i 本身(若串为 ccc 则 hw 为 1). 这时最终答案为最大的 hw 减一. 为什么要减一呢?最终的 ...

  5. GO实现Redis:GO实现内存数据库(3)

    实现Redis的database层(核心层:处理命令并返回) https://github.com/csgopher/go-redis datastruct/dict/dict.go type Con ...

  6. 【Jenkins系列】-Pipeline语法全集

    Jenkins为您提供了两种开发管道代码的方式:脚本式和声明式. 脚本式流水线(也称为"传统"流水线)基于Groovy作为其特定于域的语言. 而声明式流水线提供了简化且更友好的语法 ...

  7. AndroidBanner - ViewPager 03

    AndroidBanner - ViewPager 03 上一篇文章,描述了如何实现自动轮播的,以及手指触摸的时候停止轮播,抬起继续轮播,其实还遗留了一些问题: 当banner不可见的时候,也需要停止 ...

  8. 五月十六号java基础知识点

    1.方法引用就是用双冒号"::"来简化Lambda表达式2.方法引用四种引用方式:1)对象名::实例方法名 //用对象名调用实例方法2)类名::静态方法名 //用类名引用静态方法 ...

  9. Express实现定时发送邮件

    在开发中我们有时候需要每隔 一段时间发送一次电子邮件,或者在某个特定的时间进行发送邮件, 无需手动去操作,基于这样的情况下我们需要用到了定时任务,一般可以写个定时器,来完成相应的需求,在 node.j ...

  10. Android 事件分发机制源码分析

    if(MotionEvent.ACTION_DOWN || mFirstTouchTarget != null){ //初次的down事件到来的时候,只有父view具有决定事件是否拦截的权利.因为此时 ...