题目
题目链接:
https://www.nowcoder.com/practice/9b1fca7407954ba5a6f217e7c3537fed
核心
DFS+双端队列
参考答案Java
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
public int calculate (String s) {
//dfs,队列
return dfs(s, 0).val;
}
//当前来到s的i位置。
public Info dfs(String s, int i) {
LinkedList<String> ll = new LinkedList<>();
int cur = 0;
Info info = new Info();
while (i < s.length() && s.charAt(i) != ')') {
char c = s.charAt(i);
if (c == ' ') {
i++;
continue;
}
if (c >= '0' && c <= '9') {
cur = cur * 10 + (c - '0');
i++;
} else if (c != '(') { //遇到运算符了
addNum(ll, cur);
ll.addLast(c + "");
i++;
cur = 0;
} else {
info = dfs(s, i + 1);
i = info.index + 1;
cur = info.val;
}
}
addNum(ll, cur);
info.val = getRes(ll);
info.index = i;
return info;
}
public int getRes(LinkedList<String> ll) {
int res = 0;
boolean add = true;
String cur;
while (!ll.isEmpty()) {
cur = ll.pollFirst();
if (cur.equals("+")) add = true;
else if (cur.equals("-")) add = false;
else {
if (add) res += Integer.valueOf(cur);
else res -= Integer.valueOf(cur);
}
}
return res;
}
public void addNum(LinkedList<String> ll, int num) {
if (!ll.isEmpty()) {
String top = ll.pollLast();
if (top.equals("+") || top.equals("-")) {
ll.addLast(top);
} else {
int cur = Integer.valueOf(ll.pollLast());
if (top.equals("*")) num = cur * num;
else num = cur / num;
}
}
ll.addLast(num + "");
}
static class Info {
int index;
int val;
}
}
参考答案Go
package main
import "strconv"
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @return int整型
*/
func calculate( s string ) int {
data := dfs(s, 0)
return data[1]
}
func dfs(s string, i int) []int {
ll := []string{}
info := make([]int, 2)
cur := 0
for i < len(s) && s[i] != ')' {
c := s[i]
if c == ' ' {
i++
continue
}
if c >= '0' && c <= '9' {
cur = cur*10 + (int)(c-'0')
i++
} else if c != '(' { //遇到运算符了
add(&ll, cur)
ll = append(ll, string([]byte{c}))
cur = 0
i++
} else {
info = dfs(s, i+1)
i = info[0] + 1
cur = info[1]
}
}
add(&ll, cur)
info[1] = getRes(ll)
ll = []string{}
info[0] = i
return info
}
func getRes(ll []string) int {
res := 0
add := true
for _, cur := range ll {
if cur == "+" {
add = true
} else if cur == "-" {
add = false
} else {
num, _ := strconv.Atoi(cur)
if add {
res = res + num
} else {
res = res - num
}
}
}
return res
}
func add(ll *[]string, num int) {
size := len(*ll)
if size > 1 {
top := (*ll)[size-1]
if top == "+" || top == "-" {
//不变
} else {
s1 := (*ll)[size-2]
cur, _ := strconv.Atoi(s1)
if top == "*" {
num = cur * num
} else {
num = cur / num
}
*ll = (*ll)[:size-2]
}
}
*ll = append(*ll, strconv.Itoa(num))
}