华为OD机试真题---字符串化繁为简
华为OD机试真题中的“字符串化繁为简”题目是一个涉及字符串处理和等效关系传递的问题。以下是对该题目的详细解析:
一、题目描述
给定一个输入字符串,字符串只可能由英文字母(a~z、A~Z)和左右小括号((、))组成。当字符里存在小括号时,小括号是成对的,可以有一个或多个小括号对,小括号对不会嵌套,小括号对内可以包含1个或多个英文字母也可以不包含英文字母。要求对这个输入字符串做简化,输出一个新的字符串,满足以下条件:
-
输出字符串里只需保留输入字符串里的没有被小括号对包含的字符(按照输入字符串里的字符顺序)。
-
将每个字符替换为在小括号对里包含的字典序最小的等效字符。等效关系定义如下:
- 当小括号对内包含多个英文字母时,这些字母之间是相互等效的关系。
- 等效关系可以在不同的小括号对之间传递,即当存在a和b等效和存在b和c等效时,a和c也等效。
- 同一个英文字母的大写字母和小写字母也相互等效(即使它们分布在不同的括号对里)。
如果简化后的字符串为空,则输出为“0”。
二、示例
-
示例1:
- 输入:()abd
- 输出:abd
- 说明:输入字符串里没有被小括号包含的字符串为"abd",其中每个字符没有等效字符,输出为"abd"。
-
示例2:
- 输入:(abd)demand(fb)()for
- 输出:aemanaaor
- aabebmnor。
- 说明:等效字符集为(a,b,d,f),输入字符串里没有被小括号包含的字符串集合为"demandfor",将其中字符替换为字典序最小的等效字符后输出为:“aemanaaor”。
-
示例3:
- 输入:happy(xyz)new(wxy)year(t)
- 输出:happwnewwear
- 说明:等效字符集为(w,x,y,z),输入字符串里没有被小括号包含的字符串集合为"happynewyear",将其中字符替换为字典序最小的等效字符后输出为:“happwnewwear”。
三、解题思路
-
提取等效字符:
- 遍历输入字符串,使用栈(stack)来识别和处理小括号对。
- 当遇到左括号"("时,将其位置压入栈中。
- 当遇到右括号")"时,弹出栈顶的左括号位置,并计算这对括号之间的字符作为等效字符集合。
- 将这些等效字符转换为小写(或大写,以保持一致性),并放入一个集合(set)中去重。
-
构建等效关系:
- 使用并查集(Union Find)数据结构来维护等效关系。
- 遍历等效字符集合,将每个字符与其等效的字符合并到同一个集合中。
-
替换字符:
- 遍历输入字符串中未被小括号包含的字符部分。
- 对于每个字符,检查它是否属于某个等效字符集合。
- 如果是,则将其替换为该集合中字典序最小的字符。
-
输出结果:
- 将替换后的字符按照原顺序拼接成新的字符串。
- 如果新字符串为空,则输出"0"。
四、代码实现
import java.util.Collections;
import java.util.HashSet;
import java.util.InputMismatchException;
import java.util.NoSuchElementException;
import java.util.Scanner;
import java.util.Set;
import java.util.Stack;public class StringSimplification {/*** 主函数入口* 该函数提示用户输入一个字符串,然后调用simplifyString方法处理该字符串* 需要处理输入流的异常,确保程序的健壮性* @param args 命令行参数,未使用*/public static void main(String[] args) {try (Scanner scanner = new Scanner(System.in)) {// 提示用户输入字符串System.out.print("请输入字符串: ");String input = scanner.nextLine();// 输入验证if (input == null || input.trim().isEmpty()) {System.out.println("输入不能为空");return;}// 调用方法处理输入的字符串,并打印结果String result = simplifyString(input);System.out.println(result);} catch (InputMismatchException ime) {// 处理输入格式错误异常System.err.println("输入格式错误: " + ime.getMessage());} catch (NoSuchElementException nse) {// 处理输入流结束异常System.err.println("输入流已结束,请确保在提示后输入字符串: " + nse.getMessage());} catch (Exception e) {// 处理其他异常System.err.println("发生错误: " + e.getMessage());e.printStackTrace(); // 打印堆栈跟踪}}/*** 简化给定的字符串,通过等效字符替换和括号规则* * @param input 待简化的输入字符串,包含字母和括号* @return 简化后的字符串,其中等效字符被替换为字典序最小的字符,且不包含括号* @throws IllegalArgumentException 如果括号不匹配,则抛出此异常*/public static String simplifyString(String input) {// 使用并查集来维护等效关系UnionFind uf = new UnionFind(26 * 2); // 26个小写字母和26个大写字母// 用于存储等效字符集合Set<Character> currentSet = new HashSet<>();// 用于处理括号匹配Stack<Integer> parenthesisStack = new Stack<>();// 用于构建未被括号包含的字符序列StringBuilder newStr = new StringBuilder();// 遍历输入字符串for (int i = 0; i < input.length(); i++) {char c = input.charAt(i);if (c == '(') {// 遇到左括号,压入栈中parenthesisStack.push(i);currentSet.clear();System.out.println("遇到左括号,当前索引: " + i);} else if (c == ')') {// 遇到右括号,处理等效字符集合if (parenthesisStack.isEmpty()) {throw new IllegalArgumentException("括号不匹配");}int startIndex = parenthesisStack.pop();// 检查括号内是否有字符if (startIndex + 1 < i) {StringBuilder sb = new StringBuilder(input.substring(startIndex + 1, i));// 将等效字符转换为小写并去重for (char ch : sb.toString().toCharArray()) {ch = Character.toLowerCase(ch);currentSet.add(ch);}// 维护等效关系if (!currentSet.isEmpty()) {char minChar = Collections.min(currentSet);for (char ch : currentSet) {if (Character.isLowerCase(ch)) {uf.union(ch - 'a', minChar - 'a');} else if (Character.isUpperCase(ch)) {uf.union(ch - 'A' + 26, minChar - 'a' + 26);}}currentSet.clear();}}} else {// 非括号字符,添加到 newStr 中newStr.append(c);System.out.println("添加非括号字符: " + c);}}// 检查是否有未匹配的左括号if (!parenthesisStack.isEmpty()) {throw new IllegalArgumentException("括号不匹配");}// 替换 newStr 中的字符为等效字符集合中的最小字符StringBuilder simplifiedStr = new StringBuilder();for (char c : newStr.toString().toCharArray()) {char lowerC = Character.toLowerCase(c);int root = uf.find(lowerC - 'a'); // 查找等效字符集合的根节点(最小字符)char minEquivChar = (char)('a' + root);simplifiedStr.append(minEquivChar);System.out.println("替换字符: " + c + " -> " + minEquivChar);}// 如果简化后的字符串为空,则返回 "0"return simplifiedStr.length() == 0 ? "0" : simplifiedStr.toString();}// 并查集数据结构static class UnionFind {private int[] parent;public UnionFind(int n) {parent = new int[n];for (int i = 0; i < n; i++) {parent[i] = i;}}public int find(int x) {if (parent[x] != x) {parent[x] = find(parent[x]); // 路径压缩,将x的父节点直接指向根节点}return parent[x];}public void union(int x, int y) {int rootX = find(x);int rootY = find(y);if (rootX != rootY) {parent[rootX] = rootY; // 将x的根节点指向y的根节点}}}
}
五、注意事项
- 处理大小写:在构建等效关系和替换字符时,需要注意大小写字母之间的等效关系。可以将所有字符转换为小写(或大写)来处理。
- 边界条件:注意处理输入字符串为空或只包含括号等特殊情况。
- 性能优化:使用并查集数据结构来高效地维护等效关系,避免使用复杂的嵌套循环或递归结构。
通过上述解析和代码实现,可以有效地解决华为OD机试中的“字符串化繁为简”问题。
相关文章:
华为OD机试真题---字符串化繁为简
华为OD机试真题中的“字符串化繁为简”题目是一个涉及字符串处理和等效关系传递的问题。以下是对该题目的详细解析: 一、题目描述 给定一个输入字符串,字符串只可能由英文字母(a~z、A~Z)和左右小括号((、)࿰…...
概念解读|K8s/容器云/裸金属/云原生...这些都有什么区别?
随着容器技术的日渐成熟,不少企业用户都对应用系统开展了容器化改造。而在容器基础架构层面,很多运维人员都更熟悉虚拟化环境,对“容器圈”的各种概念容易混淆:容器就是 Kubernetes 吗?容器云又是什么?容器…...
初识Arkts
创建对象: 类: 类声明引入一个新类型,并定义其字段、方法和构造函数。 定义类后,可以使用关键字new创建实例 可以使用对象字面量创建实例 在以下示例中,定义了Person类,该类具有字段name和surname、构造函…...
基本的SELECT语句
1.SQL概述 SQL(Structured Query Language)是一种用于管理和操作关系数据库的编程语言。它是一种标准化的语言,用于执行各种数据库操作,包括创建、查询、插入、更新和删除数据等。 SQL语言具有简单、易学、高效的特点,…...
51c自动驾驶~合集30
我自己的原文哦~ https://blog.51cto.com/whaosoft/12086789 #跨越微小陷阱,行动更加稳健 目前四足机器人的全球市场上,市场份额最大的是哪个国家的企业?A.美国 B.中国 C.其他 波士顿动力四足机器人 云深处 绝影X30 四足机器人 …...
Python Tutor网站调试利器
概述 本文主要是推荐一个网站:Python Tutor. 网站首页写道: Online Compiler, Visual Debugger, and AI Tutor for Python, Java, C, C++, and JavaScript Python Tutor helps you do programming homework assignments in Python, Java, C, C++, and JavaScript. It contai…...
h5小游戏实现获取本机图片
h5小游戏实现获取本机图片 本文使用cocos引擎 1.1 需求 用户通过文件选择框选择图片。将图片内容转换为Cocos Creator的纹理 (cc.Texture2D),将纹理设置到 cc.SpriteFrame 并显示到节点中。 1.2 实现步骤 创建文件输入框用于获取文件 let input document.createElement(&quo…...
前端 javascript a++和++a的区别
前端 javascript a和a的区别 a 是先执行表达式后再自增,执行表达式时使用的是a的原值。a是先自增再执行表达示,执行表达式时使用的是自增后的a。 var a0 console.log(a); // 输出0 console.log(a); // 输出1var a0 console.log(a); // 输出1 console.l…...
OceanBase V4.x应用实践:如何排查表被锁问题
DBA在日常工作中常常会面临以下两种常见情况: 业务人员会提出问题:“表被锁了,导致业务受阻,请帮忙解决。” 业务人员还会反馈:“某个程序通常几秒内就能执行完毕,但现在却运行了好几分钟,不清楚…...
ctfshow-web入门-SSRF(web351-web360)
目录 1、web351 2、web352 3、web353 4、web354 5、web355 6、web356 7、web357 8、web358 9、web359 10、web360 1、web351 看到 curl_exec 函数,很典型的 SSRF 尝试使用 file 协议读文件: urlfile:///etc/passwd 成功读取到 /etc/passwd 同…...
【日常记录-Git】如何为post-checkout脚本传递参数
1. 简介 在Git中,post-checkout 钩子是一个在git checkout 或git switch命令成功执行后自动调用的脚本。该脚本不接受任何来自Git命令的直接参数,因为Git设计该钩子是为了在特定的版本控制操作后执行一些预定义的任务,而不是作为一个通用的脚…...
《机器人控制器设计与编程》考试试卷**********大学2024~2025学年第(1)学期
消除误解,课程资料逐步公开。 复习资料: Arduino-ESP32机器人控制器设计练习题汇总_arduino编程语言 题-CSDN博客 试卷样卷: 开卷考试,时间: 2024年11月16日 001 002 003 004 005 ……………………装………………………...
后台管理系统(开箱即用)
很久没有更新博客了,给大家带上一波福利吧,大佬勿扰 现在市面上流行的后台管理模板很多,若依,芋道等,可是这些框架对我们来说可能会有点重,所以我自己从0到1写了一个后台管理模板,你们使用时候可扩展性也会更高 项目主要功能: 成员管理,部门管理&#…...
5G CPE与4G CPE的主要区别有哪些
什么是CPE? CPE是Customer Premise Equipment(客户前置设备)的缩写,也可称为Customer-side Equipment、End-user Equipment或On-premises Equipment。CPE通常指的是位于用户或客户处的网络设备或终端设备,用于连接用户…...
量化交易系统开发-实时行情自动化交易-4.1.3.A股平均趋向指数(ADX)实现
19年创业做过一年的量化交易但没有成功,作为交易系统的开发人员积累了一些经验,最近想重新研究交易系统,一边整理一边写出来一些思考供大家参考,也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说A股平均趋向指数实现。 …...
tcp的网络惊群问题
1. SO_REUSEPORT 可以解决epoll的惊群问题 但是,现在的 TCP Server,一般都是 多进程多路IO复用(epoll) 的并发模型,比如我们常用的 nginx 。如果使用 epoll 去监听 accept socket fd 的读事件,当有新连接建立时,所有进…...
云原生之运维监控实践-使用Prometheus与Grafana实现对Nginx和Nacos服务的监测
背景 如果你要为应用程序构建规范或用户故事,那么务必先把应用程序每个组件的监控指标考虑进来,千万不要等到项目结束或部署之前再做这件事情。——《Prometheus监控实战》 去年写了一篇在Docker环境下部署若依微服务ruoyi-cloud项目的文章,当…...
软考教材重点内容 信息安全工程师 第 4 章 网络安全体系与网络安全模型
4,1 网络安全体系的主要特征: (1)整体性。网络安全体系从全局、长远的角度实现安全保障,网络安全单元按照一定的规则,相互依赖、相互约束、相互作用而形成人机物一体化的网络安全保护方式。 (2)协同性。网络安全体系依赖于多种安全机制,通过各…...
机器学习——期末复习 重点题归纳
第一题 问题描述 现有如下数据样本: 编号色泽敲声甜度好瓜1乌黑浊响高是2浅白沉闷低否3青绿清脆中是4浅白浊响低否 (1)根据上表,给出属于对应假设空间的3个不同假设。若某种算法的归纳偏好为“适应情形尽可能少”,…...
MYSQL——数据更新
一、插入数据 1.插入完整的数据记录 在MYSQL中,使用SQL语句INSERT插入一条完整的记录,语法如下: INSERT INTO 表名 [(字段名1[,...字段名n])] VALUES (值1[...,值n]); 表名——用于指定要插入的数据的表名 字段名——用于指定需要插入数据…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...
