牛客NC240 计算器(一)【较难 dfs+双端队列 Java,Go】

题目

在这里插入图片描述
题目链接:
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))
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵长辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值