856_括号的分数
2021/12/19 23:49:46
本文主要是介绍856_括号的分数,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
856_括号的分数
/** * ★☆ 启发:当参考官网的答案看不懂时,看高赞答案或者评论区,评论区的解释更加清晰,代码的解析更加详细的 */ package 栈; import java.util.Stack; /** * https://leetcode-cn.com/problems/score-of-parentheses/ * * @author Huangyujun * * 思路: 构建一个栈 如果遇到 ( 就往栈里面添加 如果遇到 ) 就去寻找最近的左括号抵消,同时计算里面的分数 * * 拿(()(()))示例, 栈结构变化如下: [(] # 遇到 ( 往栈添加 [(, (] # 继续添加 [(, 1] # 遇到 ) * ,跟栈顶的( 合成一个1,后push进去 [(, 1, (] # 遇到 ( 往栈添加 [(, 1, (, (] # 继续添加 [(, 1, * (, 1] # 遇到 ) ,跟栈顶的 ( 合成一个1, push 进去 [(, 1, 2] # 遇到 ) * ,根据栈顶判断,非左括号,则是开始有深度了,找出所有非左括号的,计算出深度(非括号的值是多少,深度就是多少),然后遇到 ( * ,pop掉后,将得分=深度 * 2,push进去 [6] # 遇到 ) ,结构是(1,2), 所以计算的话是 (1 + 2) * 2 * */ public class _856_括号的分数 { public int scoreOfParentheses(String s) { Stack<String> stack = new Stack<String>(); for (int i = 0; i < s.length(); i++) { char ch = s.charAt(i); String ch2 = Character.toString(ch); if (ch2.equals("(")) { // 一开始遇到左括号,都是直接入栈 stack.push(ch2); } else { // 分类:一开始直接是右括号,匹配一对,得一分; 如果遇到是数字,开始计算深度 if (ch2.equals(")")) {//这里要加以判断栈顶是否为(,才能匹配 if(stack.peek().equals("(")) { stack.pop(); stack.push("1"); }else { //逻辑是找到第一对之后才有机会有,进入了此状态后,才有后边的计算,☆☆☆找到第一对 是后边的情况发生前提 int depth = 0; String tmp_top = stack.pop(); while (!("(".equals(tmp_top))) { depth += Integer.parseInt(tmp_top); tmp_top = stack.pop(); } // 跳出循环,说明是遇到左括号了 // stack.pop(); 跳出时就pop() 掉了 stack.push(Integer.toString(2 * depth)); } } } } int sum = 0; while (!stack.empty()) { sum += Integer.parseInt(stack.pop()); } return sum; } }
这篇关于856_括号的分数的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现
- 2024-05-30我们小公司,哪像华为一样,用得上IPD(集成产品开发)?
- 2024-05-30java excel上传--poi
- 2024-05-30安装笔记本应用商店的pycharm,再安排pandas等模块,说是没有打包工具?
- 2024-05-29java11新特性
- 2024-05-29哪些无用敏捷指标正在破坏敏捷转型?
- 2024-05-29鸿蒙原生应用再新丁!新华社 入局鸿蒙
- 2024-05-29设计模式 之 迭代器模式(Iterator)