牛客网简单题型练习第四弹
描述
一个合法的括号匹配序列有以下定义:
1、空串""是一个合法的括号匹配序列
2、如果"X"和"Y"都是合法的括号匹配序列,"XY"也是一个合法的括号匹配序列
3、如果"X"是一个合法的括号匹配序列,那么"(X)"也是一个合法的括号匹配序列
4、每个合法的括号序列都可以由以上规则生成。
例如: "","()","()()","((()))"都是合法的括号序列
对于一个合法的括号序列我们又有以下定义它的深度:
1、空串""的深度是0
2、如果字符串"X"的深度是x,字符串"Y"的深度是y,那么字符串"XY"的深度为max(x,y) 3、如果"X"的深度是x,那么字符串"(X)"的深度是x+1
例如: "()()()"的深度是1,"((()))"的深度是3。牛牛现在给你一个合法的括号序列,需要你计算出其深度。输入描述:
输入包括一个合法的括号序列s,s长度length(2 ≤ length ≤ 50),序列中只包含'('和')'。
输出描述:
输出一个正整数,即这个序列的深度。
按我的理解 这题的意思是:
()一个括号 深度为1
(())两个括号 深度为2
((()))三个括号 深度为3
另外还有并列的
()()()深度是1
(()())深度是2
一个括号内嵌几个括号,深度为几
那我们就是写代码 找到左括号有几个 就是其深度
因为它说 会给我们一个合法的括号序列 所以只需要单单只找到左括号 得出正确答案 最后一种情况不符合
那我们只能用到栈了
栈是 先进后出 后进先出的原则
首先定义一个空的栈
Stack<Character> stack = new Stack<Character>();
需要用到栈的思想, 不断将左括号推入栈中, 然后每次遇到一个右括号从栈中弹出一个左括号, 以此删除左侧并列关系的括号, 从而使每次计算左括号次数都只包含当前串联关系的左括号数量.
代码如下:
String str = "((()())";int maxVal = 0;Stack<Character> st = new Stack<>();for(int i = 0; i<str.length(); i++){char c = str.charAt(i);if('(' == c){st.push(c);maxVal = Math.max(maxVal, st.size());}if(')' == c){st.pop();}}System.out.println(maxVal);
charAt(int index)方法是一个能够用来检索特定索引下的字符的String实例的方法。
charAt()方法返回指定索引位置的char值。索引范围为0~length()-1,如: str.charAt(0)检索str中的第一个字符,str.charAt(str.length()-1)检索最后一个字符。
我们慢慢来看:
首先当我们输入((()()))
str.charAt(i) 在循环i的数值时 依次输出 1.( 2.( 3.( 4. ) 5. ( 6 . ) 7. ) 8. )
第一次循环是( 也就是 c=(
然后( ==(
if( (==( )正确 往下执行
给栈加元素
st.push(c);
此时 栈 里面就有了一个 左括号 (
继续执行语句:
maxVal = Math.max(maxVal, st.size());
maxVal我们前面定义了:
int maxVal = 0;
这里我们需要采用的是函数Math.max取得是最大值
Math.max()函数是什么意思呢?
打个比方:
Math.max(1,2) 那取里面的大的值 就是2
多举几个:
Math.max(2,2) 结果是2
Math.max(0,1)结果是1
就是取括号里面的大的值
这样的话如果 括号是平行 的话 我们用此函数 深度就不会重复多加一了
此时,第一次循环maxVal=Math.max(0,1)
所以结果是1
详细说一下
当我们输入((()()))时
比方说 前面我们已经输入了 三个左括号 那maxVal是3 st.size()是3 深度是3
第四次循环是 ) 右括号 那maxVal还是3 st.size()是2 深度是3
第五次循环是 ( 左括号 那maxVal还是3 st.size()是3 深度是3
第六次循环是 ) 右括号 那maxVal还是3 st.size()是2 深度是3
你看 我们深度没有多加一 这就符合我们 前面说的第四种 平行括号的深度
继续执行 第二次循环 c=(
然后( ==(
if( (==( )正确 往下执行
给栈加元素
st.push(c);
此时 栈 里面就有了两个 左括号 ( (
继续执行下一条语句
maxVal = Math.max(maxVal, st.size());
继续执行语句:
maxVal = Math.max(maxVal, st.size());
此时,第2次循环maxVal=Math.max(1,2)
所以结果是2
继续执行 第三次循环 c=(
然后( ==(
if( (==( )正确 往下执行
给栈加元素
st.push(c);
此时 栈 里面就有了三个 左括号 ( ((
继续执行下一条语句
maxVal = Math.max(maxVal, st.size());
继续执行语句:
maxVal = Math.max(maxVal, st.size());
此时,第3次循环maxVal=Math.max(2,3)
所以结果是3
继续执行 第四次循环 c=)
然后第二个if语句 :)=)
if( )==))正确 往下执行
给栈减元素
st.pop();
那之前栈里是 三个左括号 (((
现在减一个 (
那就是还有两个左括号 (( 此时st.size() 是2 因为有两个括号
继续执行 第五次循环 c=(
然后( ==(
if( (==( )正确 往下执行
给栈加元素
st.push(c);
此时 栈 里面就有了三个 左括号 ( (( 此时st.size() 是3 因为有3个括号
继续执行下一条语句
maxVal = Math.max(maxVal, st.size());
继续执行语句:
maxVal = Math.max(maxVal, st.size());
此时,第5次循环maxVal=Math.max(3,3)
所以结果是3
继续执行 第六次循环 c=)
然后第二个if语句 :)=)
if( )==))正确 往下执行
给栈减元素
st.pop();
那之前栈里是 三个左括号 (((
现在减一个 (
那就是还有两个左括号 (( 此时st.size() 是2 因为有两个括号
继续执行 第7次循环 c=)
然后第二个if语句 :)=)
if( )==))正确 往下执行
给栈减元素
st.pop();
那之前栈里是 2个左括号 ((
现在减一个 (
那就是还有1个左括号 (
继续执行 第8次循环 c=)
然后第二个if语句 :)=)
if( )==))正确 往下执行
给栈减元素
st.pop();
那之前栈里是 1个左括号 (
现在减一个 (
那就是没有括号啦
结果也出来了
输出 maxVal结果是3
System.out.println(maxVal);
牛客网简单题型练习第四弹相关推荐
- 牛客网简单题型练习第三弹
代码示例: Scanner scanner = new Scanner(System.in);String s = scanner.nextLine();//按照非数字分割成数组 ah19iswm22 ...
- 华为机试在线训练--牛客网(python)第四部分
华为机试在线训练–牛客网(python) 第四部分(31~40) 第三十一题:[中级]单词倒排 题目描述 对字符串中的所有单词进行倒排. 说明: 1.每个单词是以26个大写或小写英文字母构成: 2.非 ...
- (python)牛客网(华为机试四)——较难
本博客为博主解题的部分记录,由于均为自己写的,所以答案并非最优解,有很多地方可以优化. 其他题解合集: (python)牛客网(华为机试一)--入门 (python)牛客网(华为机试二)--简单 (p ...
- 牛客网——简单排序(lower_bound( ))
链接:https://ac.nowcoder.com/acm/contest/547/F 来源:牛客网 题目描述 LXK有一个序列,从N~1,但是他不小心把序列打乱了,现在他想找你把这串序列复原. 他 ...
- 牛客网 栈的压入、弹出序列
链接:https://www.nowcoder.com/questionTerminal/d77d11405cc7470d82554cb392585106 来源:牛客网 [编程题]栈的压入.弹出序列 ...
- 牛客网-数据结构笔试题目(四)-Powerful Ksenia问题解决方案(附源码)
题意 现在我们想要在n步这样的神奇异或操作之内让数组当中的所有元素全部相等,请问这一点是否可能呢?首先输出YES或NO,表示是否有解.如果有解输出需要操作的步数,以及对应选择的元素下标. 样例 在第一 ...
- IC笔试牛客网verilog刷题总结四
47.格雷码计数器 reg [3:0] bin_out;wire [3:0] gray_wire;//格雷码转二进制always@(posedge clk or negedge rst_n)begin ...
- 牛客网项目——前置技术(四):项目调试技巧
文章目录 1. 响应状态码的含义 1.1 官方网站 1.2 常见返回码 2. 服务端断点调试技巧 3. 客户端断点调试技巧 4. 设置日志级别,并将日志输出到不同的终端 4.1 test下创建Logg ...
- 【牛客网刷题】VL1 四选一多路器
最新文章
- buildConfigField 使用
- LINUX任务(jobs)详解
- Linux系统目录结构及主要内容
- 安利几款语音识别软件
- endnote 参考文献加序号_EndNote上手 | 毕业写论文利器
- PrintStream 打印流、System 剖析、Java 16 进制转换
- 大容量内存的电脑提速技巧
- 矩阵分析(三):矩阵的列空间、行空间与零空间
- 简单的全局异常统一处理
- 中国人保为闲人谷中药科技承保产品责任险,为消费者保驾护航!
- 完美解决Windows 7更新失败(Windows Update 错误 80070003)
- 鸿蒙系统红米可以升级吗,小米、红米手机能刷鸿蒙系统吗?小米红米刷鸿蒙系统教程...
- 【日常点滴016】python游戏库arcade结合Tiled map editor地图编辑器和Pymunk物理引擎制作游戏过程记录,并最终打包为exe文件
- excel 多列内容合并为一个单元格
- Twitter账号老被封?一文教会你怎么养号
- 删除了windows系统的EFI分区导致无法开机的解决方法
- Mega软件操作教程
- 应用层 万维网WWW
- NLP相关知识点问答总结(三)
- OS-实现一个RR调度算法