华为OD刷题C卷 - 每日刷题 23(提取字符串中的最长表达式,模拟目录管理功能 - 完整实现)

1、提取字符串中的最长表达式

目标是从一个给定的字符串中提取出最长的合法简单数学表达式,并计算该表达式的值。如果存在多个同样长度的合法表达式,则选择第一个出现的表达式进行计算。

简单数学表达式的规则:
只包含0-9的数字和+、-、*三种运算符。
所有数字的计算结果不超过long类型的最大值。
表达式中操作符不能连续出现,例如"±-+1"是非法的。
如果有多个相同长度的合法表达式,选择第一个出现的表达式。
表达式必须是最长的合法表达式。

2、(模拟目录管理功能 - 完整实现):

这段 Java 代码是模拟目录管理功能的完整实现。它定义了 Main 类和两个辅助类 TreeNode 与 Tree。Tree 类包含了目录树的数据结构和基本操作,如创建目录、切换目录和获取当前路径。

main 方法处理标准输入中的命令序列,并根据命令更新目录树的状态,最终输出最后一条命令的执行结果。

// Hard.javapackage OD340;import java.util.Scanner;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @description 提取字符串中的最长表达式* @level 7* @score 100* @type 双指针、正则表达式、栈*/// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Hard {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.nextLine();System.out.println(getMaxMath(str));}//提取字符串中最长合法表达式并计算值(只包含两个操作数的,且第一个数带正负号),如有多个长度一样,则返回第一个public static long getMaxMath(String str) {char[] chars = str.toCharArray();int n = chars.length;//创建正则 匹配 (带正负号0个或1个) 数字1个或多个,然后是 + - * 必须1个 ,然后是 (不带正负号的数字)1个或多个//Pattern pattern = Pattern.compile("^([+-]?\\d+)([+*-]{1}\\d+)$");//如果匹配不只两个操作数Pattern pattern = Pattern.compile("^([+-]?\\d+)(([+*-]\\d+)+)([+*-]\\d+)$");int max = 0;long sum = 0;for (int i = 0; i < n; i++) {for (int j = i; j < n; j++) {String sub = str.substring(i, j + 1);Matcher matcher = pattern.matcher(sub);//如果匹配成功,且长度大于当前保存的最长,则更新if (matcher.find() && sub.length() > max) {max = sub.length();sum = cal(sub);}}}return sum;}//计算合法且无括号表达式的值:如 1 + 2 * 3 返回 7public static long cal(String str) {char[] chars = str.toCharArray();int n = chars.length;//存放操作数Stack<Long> stack = new Stack<>();//初始化符号和数字long number = 0;char sign = '+';//默认符号为"+" 即使第一位是-1 会+0 再 -1for (int i = 0; i < n; i++) {char c = chars[i];//如果遇到数字,拼数字if (c >= '0' && c <= '9') {number = number * 10 + (c - '0');}//没有括号和空格等不合法行为//遇到符号或已经到最后一位,将数字入栈、并刷新符号和数字if (!Character.isDigit(c) || i == n - 1) {if (sign == '+') {//该数字前面符号是“+”直接入栈stack.push(number);} else if (sign == '-') {//该数字前面的符号是“-”,变负数后入栈stack.push(-1 * number);} else if (sign == '*') {//该数字前面是乘,弹出一个相乘后再入栈stack.push(stack.pop() * number);}//刷新符号sign = c;//刷新数字number = 0;}}//将栈中的操作数求和long sum = 0;for (long i : stack) {sum += i;}return sum;}
}// Main.javapackage OD340;import java.util.Scanner;
import java.util.Stack;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @description 提取字符串中的最长表达式* @level 7* @score 100* @type 双指针、正则表达式、栈*//*** 题目描述* 提取字符串中的最长合法简单数学表达式,字符串长度最长的,并计算表达式的值。如果没有,则返回 0* <p>* 简单数学表达式只能包含以下内容:* <p>* 0-9数字,符号+-** 说明:* <p>* 所有数字,计算结果都不超过long* 如果有多个长度一样的,请返回第一个表达式的结果* 数学表达式,必须是最长的,合法的* 操作符不能连续出现,如 +--+1 是不合法的* 输入描述* 字符串* <p>* 输出描述* 表达式值*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.nextLine();System.out.println(getMaxMath(str));}//提取字符串中最长合法表达式并计算值(只包含两个操作数的,且第一个数带正负号),如有多个长度一样,则返回第一个public static long getMaxMath(String str) {char[] chars = str.toCharArray();int n = chars.length;//创建正则 匹配 (带正负号0个或1个) 数字1个或多个,然后是 + - * 必须1个 ,然后是 (不带正负号的数字)1个或多个Pattern pattern = Pattern.compile("^([+-]?\\d+)([+*-]{1}\\d+)$");//如果匹配不只两个操作数int max = 0;long sum = 0;for (int i = 0; i < n; i++) {for (int j = i; j < n; j++) {String sub = str.substring(i, j + 1);Matcher matcher = pattern.matcher(sub);//如果匹配成功,且长度大于当前保存的最长,则更新if (matcher.find() && sub.length() > max) {max = sub.length();sum = cal(sub);}}}return sum;}//计算合法且无括号表达式的值:如 1 + 2 * 3 返回 7public static long cal(String str) {char[] chars = str.toCharArray();int n = chars.length;//存放操作数Stack<Long> stack = new Stack<>();//初始化符号和数字long number = 0;char sign = '+';//默认符号为"+" 即使第一位是-1 会+0 再 -1for (int i = 0; i < n; i++) {char c = chars[i];//如果遇到数字,拼数字if (c >= '0' && c <= '9') {number = number * 10 + (c - '0');}//没有括号和空格等不合法行为//遇到符号或已经到最后一位,将数字入栈、并刷新符号和数字if (!Character.isDigit(c) || i == n - 1) {if (sign == '+') {//该数字前面符号是“+”直接入栈stack.push(number);} else if (sign == '-') {//该数字前面的符号是“-”,变负数后入栈stack.push(-1 * number);} else if (sign == '*') {//该数字前面是乘,弹出一个相乘后再入栈stack.push(stack.pop() * number);}//刷新符号sign = c;//刷新数字number = 0;}}//将栈中的操作数求和long sum = 0;for (long i : stack) {sum += i;}return sum;}
}// Simple.javapackage OD340;import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @description 简单版* @level 7* @score 100* @type 双指针、正则表达式、栈*//*** 题目描述* 提取字符串中的最长合法简单数学表达式,字符串长度最长的,并计算表达式的值。如果没有,则返回 0* <p>* 简单数学表达式只能包含以下内容:* <p>* 0-9数字,符号+-** 说明:* <p>* 所有数字,计算结果都不超过long* 如果有多个长度一样的,请返回第一个表达式的结果* 数学表达式,必须是最长的,合法的* 操作符不能连续出现,如 +--+1 是不合法的* 输入描述* 字符串* <p>* 输出描述* 表达式值*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Simple {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String str = sc.nextLine();//简单合法表达式为只有两个操作数 如 1+1 -1+1 +1+1都是合法的//正则包含三部分:开头^(含有0个或1个符号的数字1个到多个) (操作符+-*) (数字1个到多个)$结尾Pattern pattern = Pattern.compile("^([+-]?\\d+)([+*-])(\\d+)$");int maxLength = 0;long sum = 0;//遍历for (int i = 0; i < str.length(); i++) {for (int j = i; j < str.length(); j++) {String sub = str.substring(i, j + 1);Matcher matcher = pattern.matcher(sub);//如果匹配到且长度大于当前保存的长度,则更新if (matcher.find() && sub.length() > maxLength) {maxLength = sub.length();//求解 使用matcher.group(1)和matcher.group(3)分别获取两个数字long num1 = Long.parseLong(matcher.group(1));long num2 = Long.parseLong(matcher.group(3));//操作符String sign = matcher.group(2);switch (sign) {case "+":sum = num1 + num2;break;case "-":sum = num1 - num2;break;case "*":sum = num1 * num2;break;}}}}System.out.println(sum);}
}
package OD341;import java.util.HashMap;
import java.util.Scanner;/*** @description 模拟目录管理功能* @level 6* @score 200* @url https://hydro.ac/d/HWOD2023/p/OD341*/
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);//初始化目录树Tree tree = new Tree();//记录最后一条命令的输出 除了pwd有输出,其他都输出空//输出为空时要输出根目录"/" 才能百分百解法String command_output = "/";outer:while (sc.hasNextLine()) {String line = sc.nextLine();String[] tmp = line.split(" ");//命令 mkdir cd pwdString cmd_key = tmp[0];//参数//String cmd_val =  tmp[1];//pwd没有参数,可能会越界//常量在前面,防止空指针异常if ("pwd".equals(cmd_key)) {//pwd不需要参数,有参数的错误输入什么都不需要干if (tmp.length != 1) continue;//否则,就将当前命令的输出结果保存command_output = tree.pwd();} else if ("mkdir".equals(cmd_key) || "cd".equals(cmd_key)) {//参数只能有1个if (tmp.length != 2) continue;//目录名String cmd_val = tmp[1];//除了 cd .. 不需要检测 其他都需要检测文件名是否合法if (!(cmd_key.equals("cd") && cmd_val.equals(".."))) {for (int i = 0; i < cmd_val.length(); i++) {char c = cmd_val.charAt(i);//不合法,直接跳到下一个命令if (c < 'a' || c > 'z') continue outer;}}//实现操作if ("mkdir".equals(cmd_key)) {tree.mkdir(cmd_val);//mkdir操作没有输出,清空当前保存的最后输出command_output = "/";} else {//cdtree.cd(cmd_val);//清空command_output = "/";}}}//输出最后一条命令的输入,如果是mkdir cd 则没有输出System.out.println(command_output);}//节点 包含父目录 子目录<>static class TreeNode {//目录名String curDicName;//父目录TreeNode fa;//子目录:<子目录名,子目录对象>HashMap<String, TreeNode> ch;//构造方法 新建一个节点<节点名,父目录>public TreeNode(String curDicName, TreeNode fa) {this.curDicName = curDicName;this.fa = fa;this.ch = new HashMap<>();}}//目录树static class Tree {//根节点TreeNode root;//当前层TreeNode cur;//默认无参构造方法public Tree() {//根节点 视为名称为/this.root = new TreeNode("/", null);this.cur = root;}//新建目录public void mkdir(String dicName) {//如果有同名子目录,则不做任务操作//子目录名,子目录对象(名称+"/",该子目录的父目录)this.cur.ch.putIfAbsent(dicName, new TreeNode(dicName + "/", this.cur));}//进入目录public void cd(String dicName) {//cd .. 防止空指针异常if ("..".equals(dicName)) {//如果上层不为空,则进入上层if (this.cur.fa != null) {this.cur = this.cur.fa;}//如果为空,不进行任何操作} else {//cd dicName//有同名子目录才进入if (this.cur.ch.containsKey(dicName)) {//进入this.cur = this.cur.ch.get(dicName);}//没有同名子目录则不做任何操作}}//pwdpublic String pwd() {StringBuilder sb = new StringBuilder();//从当前层遍历到root,每次插入到头部,即倒序TreeNode cur = this.cur;while (cur != null) {// c/ -> b/c/ -> a/b/c/ -> /a/b/c/sb.insert(0, cur.curDicName);cur = cur.fa;}return sb.toString();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/28625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

操作系统复习-线程同步

互斥量 两个线程的指令交叉执行互斥量可以保证先后执行称为原子性 原子性是指一系列操作不可被中断的特性这一系列操作要么全部执行完成&#xff0c;要么全部没有执行不存在部分执行部分未执行的情况 互斥锁 互斥量是最简单的线程同步的方法互斥锁&#xff0c;处于两态之一的…

01 飞行器设计 —— 一门独立的学科

01 飞行器设计 —— 一门独立的学科 01 引言02 飞机设计概述2-1 什么是飞机设计&#xff1f;2-1 飞机设计是从哪里开始的&#xff1f;2-2 如何成为一名飞机设计师&#xff1f;2-4 本书的组织 参考文献 说明&#xff1a;关于Raymer的《Aircraft Design》的读书笔记&#xff1b; …

解读ROS功能包模块的步骤

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言解读ROS功能包模块的步骤前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 推荐开发经验及方法博客专栏: [https:/…

哇塞,超好吃的麻辣片,一口就爱上

最近&#xff0c;我发现了一款让人欲罢不能的美食——食家巷麻辣片&#xff01;&#x1f60d; 一打开包装&#xff0c;那浓郁的麻辣香气就扑鼻而来&#xff0c;瞬间刺激着我的嗅觉神经。&#x1f603;食家巷麻辣片的外观色泽鲜艳&#xff0c;红通通的一片&#xff0c;看着就特…

扩展动态数据统计

以下是三种主要的方式来实现您的需求&#xff0c;分别使用原生的HTML/JavaScript、Vue.js框架和React框架。 1. 使用原生HTML/JavaScript 添加复杂度类型选择 <div class"complexity-type-select"><label>选择复杂度类型&#xff1a;</label>&l…

Android断点续传原理及实现

常见两种网络请求方式 一、 HttpURLConnection HttpURLConnection的setRequestProperty()方法&#xff0c;对我们要读取的字节部分进行控制&#xff0c;比如: 1.Range0-100代表只读取前100个字节。 2.Range100-500代表读取从第100个字节开始&#xff0c;读到第500个字节为止。…

常见的宽基指数基金

指数基金投资指南 ❝ 这篇博客里面的内容主要来自于银行螺丝钉的《定投十年&#xff0c;财务自由》和《指数基金投资指南》这两本书中章“常见的宽基指数”&#xff0c;最近第三次读这本书&#xff0c;打算做一点笔记加深自己的印象。 博客中很多内容是从书中摘抄的&#xff0c…

【git使用三】git工作机制与命令用法

目录 git工作机制和相关概念 四个重要区域 分支的概念 上传代码到远程分支的基本流程 克隆代码 仓库同步 开发者如何提交代码到远程仓库分支 1.初始化本地仓库 2.关联本地仓库和远程仓库 创建关联 查看关联情况 如何解除关联 3.推送代码到远程仓库 3.1先下拉远程…

PyTorch计算机视觉入门:测试模型与评估,对单帧图片进行推理

在完成模型的训练之后&#xff0c;对模型进行测试与评估是至关重要的一步&#xff0c;它能帮助我们理解模型在未知数据上的泛化能力。本篇指南将带您了解如何使用PyTorch进行模型测试&#xff0c;并对测试结果进行分析。我们将基于之前训练好的模型&#xff0c;演示如何加载数据…

解决老毛子路由器自带微信提示功能无法触发问题

新买了一个二手的RM AC2100&#xff0c;刷了老毛子后&#xff0c;发现自带的上下线微信提示无法使用(方糖公众号无信息) 经我开启SSH&#xff0c;将上下线部分代码拿出来调试发现&#xff0c;发不出来的原因是原版信息发送长度过长&#xff0c;需要截取一部分才能发送成功。 …

【Android面试八股文】说一说JVM、DVM(Dalvik VM)和ART的区别

文章目录 1. JVM(Java Virtual Machine):2. DVM(Dalvik Virtual Machine):与JVM区别基于的架构不同执行的字节码不同3. ART(Android Runtime):与DVM的区别4. 什么是JIT?4.1 什么是JIT4.2 JIT 编译的优势包括:4.3 对于 DVM 和 ART,它们在 JIT(Just-In-Time)编译方…

【学习笔记】centos7安装mysql相关事项

究极恶心的体验 依赖要按照顺序安装&#xff0c;有些依赖安装位置也不同 非常细节 mysql安装包&#xff1a;mysql官网下载地址 centos7选择Red Hat Enterprise Linux 7 / Oracle Linux 7 (x86, 64-bit), RPM Bundle 下载版本自选 安装视频教程&#xff1a;centos7.5安装mysql …

消息队列-RabbitMQ-延时队列实现

死信队列 DLX,全称为Dead-Letter-Exchange,死信交换机&#xff0c;死信邮箱。当消息在一个队列中变成死信之后&#xff0c;它能重新发送到另外一个交换器中&#xff0c;这个交换器就是DLX&#xff0c;绑定DLX的队列就称为死信队列。 导致死信的几种原因&#xff1a; ● 消息…

Spring配置那些事

一、引言 配置是一个项目中不那么起眼&#xff0c;但却有非常重要的东西。在工程项目中&#xff0c;我们一般会将可修改、易变、不确定的值作为配置项&#xff0c;在配置文件/配置中心中设置。 比方说&#xff0c;不同环境有不同的数据库地址、不同的线程池大小等&#xff0c…

【计算机毕业设计】241外卖微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

jadx+android studio+雷电模拟器 动态调试apk

# 环境准备 1.雷电模拟器&#xff0c;开启root 2.jadx&#xff1a; https://sourceforge.net/projects/jadx.mirror/files/v1.5.0/jadx-gui-1.5.0-with-jre-win.zip/download 3.java jdk 11 https://www.oracle.com/cn/java/technologies/javase/jdk11-archive-downloads.…

【文献阅读】Adaptive Arrays

符号表 由于论文内符号繁杂&#xff0c;这里写了一个符号表 符号含义 μ k l \mu_{kl} μkl​kl协方差项 n k n_k nk​K通道的复包络 n l n_l nl​L通道的复包络 μ l k \mu_{lk} μlk​kl协方差项的共轭 α \alpha α定义信号的幅度和时间变化 s k s_k sk​k信道中的信号 w …

什么是Dubbo?

文章目录 1、Dubbo介绍1.1 什么是Dubbo1.2 Dubbo关键特性1.3 什么是RPC1.4 实现RPC的方式1.5 Dubbo中的五大核心组件 1、Dubbo介绍 Apache Dubbo是一款高性能、轻量级的开源微服务开发框架&#xff0c;它提供了RPC通信与微服务治理两大关键能力。这意味着&#xff0c;使用Dubbo…

【Linux】进程_6

文章目录 五、进程8. 进程地址空间 未完待续 五、进程 8. 进程地址空间 上图可能很多人都看过了&#xff0c;这里再来验证一下&#xff1a; 验证位置&#xff1a; 验证堆栈的生长方向&#xff1a; 在上面的空间布局图中&#xff0c;有一个疑问&#xff0c;画的空间是 内存…

【RabbitMQ】初识 RabbitMQ

初识 RabbitMQ 1.认识 RabbitMQ1.1 介绍1. 2.使用场景1.2.1 推送通知1.2.2 异步任务1.2.3 多平台应用的通信1.2.4 消息延迟1.2.5 远程过程调用 1.3 特性 2.基本概念2.1 生产者、消费者和代理2.2 消息队列2.3 交换机2.3.1 direct2.3.2 topic2.3.3 headers2.3.4 fanout 2.4 绑定2…