2021-05-23:给定一个字符串str,str表示一个公式,公式里可能有整数、加减乘除符号和左右括号。返回公式的计算结果,难点在于括号可能嵌套很多层。str=“48*((70-65)-43)+8*
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
}
执行结果如下:

2021-05-23:给定一个字符串str,str表示一个公式,公式里可能有整数、加减乘除符号和左右括号。返回公式的计算结果,难点在于括号可能嵌套很多层。str=“48*((70-65)-43)+8*的更多相关文章
- ES6--javascript判断一个字符串是否存在另一个字符串中
es5中我们经常使用indexof()方法来判断一个字符串是否包含另外一个字符串中. 如果存在则返回匹配到的第一个索引值.如果没有则返回 -1.所以,判断一个字符串是否包含另外一个字符串中只需要判断是 ...
- java集合TreeMap应用---求一个字符串中,每一个字母出现的次数
package cn.itcast.p1.map.test; import java.util.Iterator; import java.util.Map; import java.util.Tre ...
- JavaScript 判断一个字符串是否在另一个字符串中
传统上,JavaScript只有indexOf方法,可以用来确定一个字符串是否包含在另一个字符串中.ES6又提供了三种新方法. includes():返回布尔值,表示是否找到了参数字符串. start ...
- 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符。 给定一个字符串(不一定全为字母)A及它的长度n。请返回第一个重复出现的字符。保证字符串中有重复字符,字符串的长度小于等于500。
// 第一种方法 // ConsoleApplication10.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include < ...
- mysql如何判断一个字符串是否包含另外一个字符串?
转自:http://blog.csdn.net/hechurui/article/details/49278493 判断子字符串在父字符串当中的索引: SELECT LOCATE("b&qu ...
- jQuery判断一个字符串中是否包含一个字符串(一)
var key = 'java'; var str = "hello,javascript,welcome to my world"; if(key.indexOf(str)!=- ...
- 【LintCode】判断一个字符串是否包含另一个字符串的所有字符
问题描述: 比较两个字符串A和B,确定A中是否包含B中所有的字符.字符串A和B中的字符都是 大写字母. 样例 给出 A = "ABCD" B = "ACD",返 ...
- [LintCode]判断一个字符串是否包含另一个字符串的所有字符
问题描述: 比较两个字符串A和B,确定A中是否包含B中所有的字符.字符串A和B中的字符都是 大写字母. 样例 给出 A = "ABCD" B = "ACD",返 ...
- java中如何判断一个字符串是否包含另外一个字符串的方法
indexOf(String s)的使用,如果包含,返回的值是包含该子字符串在父类字符串中起始位置: 如果不包含必定全部返回值为-1 package my_automation; public cla ...
- js 经典正则判断 一个字符串是否包含另一个字符串
if (!new RegExp(list_table[i].value.split("—")[0]).test(lhtj)) { }判断在lhtj中是否包含list_table[i ...
随机推荐
- Android笔记--基础的连接数据库的操作
start.java package com.example.myapplication; import androidx.activity.result.ActivityResult; import ...
- BeautifulSoup模块的使用方法
本篇文章主要讲bs4模块(BeautifulSoup),这个模块能做么呢?用一句话来概括的话:beautifulsoup4 从HTML或XML文件中提取数据的Python库,用它来解析爬取回来的xml ...
- Monkey二次开发 -- Monkey jar包构建
前面已经下载好了Android源码,可以在对应目录下构建二次开发后的monkey jar包了: 当前环境:Ubuntu16.04,Andorid10源码. 1.初始化环境 cd进入andr ...
- 本地搭建Stable-Diffusion 教程
前置条件 有一些python的基础 会使用git 有梯子(最好可以全局代理) Windows系统 + 英伟达1060以上显卡 (mac或者linux 以及电脑是AMD显卡,安装的话,可以自行搜索相关教 ...
- Spring IOC——源码分析
Spring 容器的 refresh() 创建容器 1 //下面每一个方法都会单独提出来进行分析 2 @Override 3 public void refresh() throws BeansExc ...
- Sentinel 流量控制
一.Sentinel 介绍 Sentinel 是阿里巴巴出品的面向分布式服务架构的轻量级流量控制组件,主要以流量为切入点,从限流,流量整形.熔断降级.系统负载保护等多个维度来保障微服务的稳定性.主页地 ...
- RochyLinux 8.6安装Oracle19c Client
一.环境准备 1.1 软件下载 下载地址:https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html 其中c ...
- PHP 微信三方平台代公众号发起网页授权 获取用户信息
1.获取code 2.通过授权回调地址的code获取用户access_token和open_id 3.通过access_token和open_id 获取用户基本信息 class wx_user { p ...
- 团队如何选择合适的Git分支策略?
现代软件开发过程中要实现高效的团队协作,需要使用代码分支管理工具实现代码的共享.追溯.回滚及维护等功能.目前流行的代码管理工具,包括CVS,SVN,Git,Mercurial等. 相比CVS和SVN的 ...
- 使用Kali复现永恒之蓝
使用Kali复现永恒之蓝 本次实验为离线靶机测试 实验步骤 确认测试环境:在开始测试之前,需要确认测试环境是否符合要求.我使用的是一台运行Kali的测试机和一台运行Windows 7 64位的靶机.确 ...