牛客面试Top101: BM8 表达式求值【java,go】

题目

BM49 表达式求值

题目

题解(304)

讨论(241)

排行

面经

中等 通过率:37.06% 时间限制:1秒 空间限制:256M

知识点

递归

描述

请写一个整数计算器,支持加减乘三种运算和括号。

数据范围:

0≤∣s∣≤100,保证计算结果始终在整型范围内

要求:空间复杂度:

O(n),时间复杂度

O(n)

示例1

输入:

"1+2"

复制

返回值:

3

复制

示例2

输入:

"(2*(3-4))5"
复制
返回值:
-10
复制
示例3
输入:
"3+2
3*4-1"

复制

返回值:

26

Java

java 复制代码
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 返回表达式的值
     * @param s string字符串 待计算的表达式
     * @return int整型
     */
    public int solve (String s) {
        return f_bm49(s, 0).curdata;
    }

    public Info f_bm49(String s, int i) {
        LinkedList<String> list = new LinkedList<>();
        Info info = new Info();
        int cur = 0;
        while (i < s.length() && s.charAt(i) != ')') {
            char c = s.charAt(i);
            if (c == ' ') {
                i++;
                continue;
            } else if (c >= '0' && c <= '9') {
                cur = cur * 10 + (int)(c - '0');
                i++;
            } else if (c != '(') { //遇到运算符了
                addNumToLinkedlist(list, cur);
                list.addLast(c + "");
                cur = 0;
                i++;
            } else {
                info = f_bm49(s, i + 1);
                i = info.curindex + 1;
                cur = info.curdata;
            }
        }
        addNumToLinkedlist(list, cur);
        info.curdata = getAllDataSum(
                           list); //list里只存储数字,加和减,乘除已经提前处理了
        info.curindex = i;
        return info;
    }

    public int getAllDataSum(LinkedList<String> list) {
        int cursum = 0;
        boolean add = true;
        while (!list.isEmpty()) {
            String tmp = list.pollFirst();
            if (tmp.equals("+")) add = true;
            else if (tmp.equals("-")) add = false;
            else {
                if (add) cursum += Integer.valueOf(tmp);
                else cursum -= Integer.valueOf(tmp);
            }
        }
        return cursum;
    }
    public void addNumToLinkedlist(LinkedList<String> list, int curnum) {
        if (!list.isEmpty()) {
            String top = list.pollLast();
            if (top.equals("+") || top.equals("-")) list.addLast(top);
            else {
                int tmp =   Integer.valueOf(list.pollLast());
                if (top.equals("*")) curnum = tmp * curnum;
                else curnum = tmp / curnum;
            }
        }

        list.addLast(String.valueOf(curnum));
    }
    static class Info {
        int curdata;
        int curindex;
        public Info() {}
    }
}

golang

go 复制代码
package main

import "strconv"

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 返回表达式的值
 * @param s string字符串 待计算的表达式
 * @return int整型
 */
func solve(s string) int {
	info := dfs_zch(s, 0)
	return info.data
}

func dfs_zch(s string, i int) InfoZCH {
	doublelist := []string{}
	cur := 0
	help := InfoZCH{}
	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 != '(' { //遇到运算符了
			addCurToList(&doublelist, cur)
			doublelist = append(doublelist, string(c))
			cur = 0
			i++
		} else {
			help = dfs_zch(s, i+1)
			i = help.index + 1
			cur = help.data
		}
	}

	addCurToList(&doublelist, cur)
	help.data = addListsum(&doublelist)
	help.index = i
	return help
}

func addListsum(doublelist *[]string) int {
	add := true
	ans := 0

	for len(*doublelist) > 0 {
		top := (*doublelist)[0]
		*doublelist = (*doublelist)[1:]
		if top == "+" {
			add = true
		} else if top == "-" {
			add = false
		} else {
			curint, _ := strconv.Atoi(top)
			if add {
				ans += curint
			} else {
				ans -= curint
			}
		}
	}
	return ans
}

func addCurToList(doublelist *[]string, cur int) {
	if len(*doublelist) > 0 {
		top := (*doublelist)[len(*doublelist)-1]
		*doublelist = (*doublelist)[:len(*doublelist)-1]
		if top == "+" || top == "-" {
			*doublelist = append(*doublelist, top)
			*doublelist = append(*doublelist, strconv.Itoa(cur))
		} else {
			if len(*doublelist) > 0 {
				prevalue := (*doublelist)[len(*doublelist)-1]
				*doublelist = (*doublelist)[:len(*doublelist)-1]
				prevalueint, _ := strconv.Atoi(prevalue)

				if top == "*" {
					cur = prevalueint * cur
				} else {
					cur = prevalueint / cur
				}
			}
			*doublelist = append(*doublelist, strconv.Itoa(cur))
		}
	} else {
		*doublelist = append(*doublelist, strconv.Itoa(cur))
	}
}

type InfoZCH struct {
	data  int
	index int
}
相关推荐
程序员爱钓鱼1 小时前
Go并发同步核心库:syn 包深度指南
后端·面试·go
Fairy要carry1 小时前
面试-单 Agent 上下文膨胀问题
chrome·面试·职场和发展
Tisfy1 小时前
LeetCode 3212.统计 X 和 Y 频数相等的子矩阵数量:前缀和
算法·leetcode·前缀和·矩阵
jaysee-sjc1 小时前
十六、Java 网络编程全解析:UDP/TCP 通信 + BS/CS 架构
java·开发语言·网络·tcp/ip·算法·架构·udp
顶点多余2 小时前
Linux中基础IO知识全解
linux·服务器·算法
编程之升级打怪2 小时前
简单的测试搜索词的分割算法思路
java·算法
.select.2 小时前
虚函数和虚表
开发语言·c++·算法
靠沿2 小时前
【优选算法】专题十七——多源BFS(最短路径问题)
java·算法·宽度优先
小江的记录本2 小时前
【HashMap】HashMap 系统性知识体系全解(附《HashMap 面试八股文精简版》)
java·前端·后端·容器·面试·hash·哈希