当前位置: 首页 > news >正文

华为OD机试真题---字符串化繁为简

华为OD机试真题中的“字符串化繁为简”题目是一个涉及字符串处理和等效关系传递的问题。以下是对该题目的详细解析:

一、题目描述

给定一个输入字符串,字符串只可能由英文字母(a~z、A~Z)和左右小括号((、))组成。当字符里存在小括号时,小括号是成对的,可以有一个或多个小括号对,小括号对不会嵌套,小括号对内可以包含1个或多个英文字母也可以不包含英文字母。要求对这个输入字符串做简化,输出一个新的字符串,满足以下条件:

  1. 输出字符串里只需保留输入字符串里的没有被小括号对包含的字符(按照输入字符串里的字符顺序)。

  2. 将每个字符替换为在小括号对里包含的字典序最小的等效字符。等效关系定义如下:

    • 当小括号对内包含多个英文字母时,这些字母之间是相互等效的关系。
    • 等效关系可以在不同的小括号对之间传递,即当存在a和b等效和存在b和c等效时,a和c也等效。
    • 同一个英文字母的大写字母和小写字母也相互等效(即使它们分布在不同的括号对里)。

如果简化后的字符串为空,则输出为“0”。

二、示例

  1. 示例1

    • 输入:()abd
    • 输出:abd
    • 说明:输入字符串里没有被小括号包含的字符串为"abd",其中每个字符没有等效字符,输出为"abd"。
  2. 示例2

    • 输入:(abd)demand(fb)()for
    • 输出:aemanaaor
    • aabebmnor。
    • 说明:等效字符集为(a,b,d,f),输入字符串里没有被小括号包含的字符串集合为"demandfor",将其中字符替换为字典序最小的等效字符后输出为:“aemanaaor”。
  3. 示例3

    • 输入:happy(xyz)new(wxy)year(t)
    • 输出:happwnewwear
    • 说明:等效字符集为(w,x,y,z),输入字符串里没有被小括号包含的字符串集合为"happynewyear",将其中字符替换为字典序最小的等效字符后输出为:“happwnewwear”。

三、解题思路

  1. 提取等效字符

    • 遍历输入字符串,使用栈(stack)来识别和处理小括号对。
    • 当遇到左括号"("时,将其位置压入栈中。
    • 当遇到右括号")"时,弹出栈顶的左括号位置,并计算这对括号之间的字符作为等效字符集合。
    • 将这些等效字符转换为小写(或大写,以保持一致性),并放入一个集合(set)中去重。
  2. 构建等效关系

    • 使用并查集(Union Find)数据结构来维护等效关系。
    • 遍历等效字符集合,将每个字符与其等效的字符合并到同一个集合中。
  3. 替换字符

    • 遍历输入字符串中未被小括号包含的字符部分。
    • 对于每个字符,检查它是否属于某个等效字符集合。
    • 如果是,则将其替换为该集合中字典序最小的字符。
  4. 输出结果

    • 将替换后的字符按照原顺序拼接成新的字符串。
    • 如果新字符串为空,则输出"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的根节点}}}
}

五、注意事项

  1. 处理大小写:在构建等效关系和替换字符时,需要注意大小写字母之间的等效关系。可以将所有字符转换为小写(或大写)来处理。
  2. 边界条件:注意处理输入字符串为空或只包含括号等特殊情况。
  3. 性能优化:使用并查集数据结构来高效地维护等效关系,避免使用复杂的嵌套循环或递归结构。

通过上述解析和代码实现,可以有效地解决华为OD机试中的“字符串化繁为简”问题。

相关文章:

华为OD机试真题---字符串化繁为简

华为OD机试真题中的“字符串化繁为简”题目是一个涉及字符串处理和等效关系传递的问题。以下是对该题目的详细解析&#xff1a; 一、题目描述 给定一个输入字符串&#xff0c;字符串只可能由英文字母&#xff08;a~z、A~Z&#xff09;和左右小括号&#xff08;(、)&#xff0…...

概念解读|K8s/容器云/裸金属/云原生...这些都有什么区别?

随着容器技术的日渐成熟&#xff0c;不少企业用户都对应用系统开展了容器化改造。而在容器基础架构层面&#xff0c;很多运维人员都更熟悉虚拟化环境&#xff0c;对“容器圈”的各种概念容易混淆&#xff1a;容器就是 Kubernetes 吗&#xff1f;容器云又是什么&#xff1f;容器…...

初识Arkts

创建对象&#xff1a; 类&#xff1a; 类声明引入一个新类型&#xff0c;并定义其字段、方法和构造函数。 定义类后&#xff0c;可以使用关键字new创建实例 可以使用对象字面量创建实例 在以下示例中&#xff0c;定义了Person类&#xff0c;该类具有字段name和surname、构造函…...

基本的SELECT语句

1.SQL概述 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理和操作关系数据库的编程语言。它是一种标准化的语言&#xff0c;用于执行各种数据库操作&#xff0c;包括创建、查询、插入、更新和删除数据等。 SQL语言具有简单、易学、高效的特点&#xff0c;…...

51c自动驾驶~合集30

我自己的原文哦~ https://blog.51cto.com/whaosoft/12086789 #跨越微小陷阱&#xff0c;行动更加稳健 目前四足机器人的全球市场上&#xff0c;市场份额最大的是哪个国家的企业&#xff1f;A.美国 B.中国 C.其他 波士顿动力四足机器人 云深处 绝影X30 四足机器人 &#x1f…...

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 是先执行表达式后再自增&#xff0c;执行表达式时使用的是a的原值。a是先自增再执行表达示&#xff0c;执行表达式时使用的是自增后的a。 var a0 console.log(a); // 输出0 console.log(a); // 输出1var a0 console.log(a); // 输出1 console.l…...

OceanBase V4.x应用实践:如何排查表被锁问题

DBA在日常工作中常常会面临以下两种常见情况&#xff1a; 业务人员会提出问题&#xff1a;“表被锁了&#xff0c;导致业务受阻&#xff0c;请帮忙解决。” 业务人员还会反馈&#xff1a;“某个程序通常几秒内就能执行完毕&#xff0c;但现在却运行了好几分钟&#xff0c;不清楚…...

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 函数&#xff0c;很典型的 SSRF 尝试使用 file 协议读文件&#xff1a; urlfile:///etc/passwd 成功读取到 /etc/passwd 同…...

【日常记录-Git】如何为post-checkout脚本传递参数

1. 简介 在Git中&#xff0c;post-checkout 钩子是一个在git checkout 或git switch命令成功执行后自动调用的脚本。该脚本不接受任何来自Git命令的直接参数&#xff0c;因为Git设计该钩子是为了在特定的版本控制操作后执行一些预定义的任务&#xff0c;而不是作为一个通用的脚…...

《机器人控制器设计与编程》考试试卷**********大学2024~2025学年第(1)学期

消除误解&#xff0c;课程资料逐步公开。 复习资料&#xff1a; Arduino-ESP32机器人控制器设计练习题汇总_arduino编程语言 题-CSDN博客 试卷样卷&#xff1a; 开卷考试&#xff0c;时间&#xff1a; 2024年11月16日 001 002 003 004 005 ……………………装………………………...

后台管理系统(开箱即用)

很久没有更新博客了&#xff0c;给大家带上一波福利吧,大佬勿扰 现在市面上流行的后台管理模板很多,若依,芋道等,可是这些框架对我们来说可能会有点重,所以我自己从0到1写了一个后台管理模板,你们使用时候可扩展性也会更高 项目主要功能: 成员管理&#xff0c;部门管理&#…...

5G CPE与4G CPE的主要区别有哪些

什么是CPE&#xff1f; CPE是Customer Premise Equipment&#xff08;客户前置设备&#xff09;的缩写&#xff0c;也可称为Customer-side Equipment、End-user Equipment或On-premises Equipment。CPE通常指的是位于用户或客户处的网络设备或终端设备&#xff0c;用于连接用户…...

量化交易系统开发-实时行情自动化交易-4.1.3.A股平均趋向指数(ADX)实现

19年创业做过一年的量化交易但没有成功&#xff0c;作为交易系统的开发人员积累了一些经验&#xff0c;最近想重新研究交易系统&#xff0c;一边整理一边写出来一些思考供大家参考&#xff0c;也希望跟做量化的朋友有更多的交流和合作。 接下来继续说说A股平均趋向指数实现。 …...

tcp的网络惊群问题

1. SO_REUSEPORT 可以解决epoll的惊群问题 但是&#xff0c;现在的 TCP Server&#xff0c;一般都是 多进程多路IO复用(epoll) 的并发模型&#xff0c;比如我们常用的 nginx 。如果使用 epoll 去监听 accept socket fd 的读事件&#xff0c;当有新连接建立时&#xff0c;所有进…...

云原生之运维监控实践-使用Prometheus与Grafana实现对Nginx和Nacos服务的监测

背景 如果你要为应用程序构建规范或用户故事&#xff0c;那么务必先把应用程序每个组件的监控指标考虑进来&#xff0c;千万不要等到项目结束或部署之前再做这件事情。——《Prometheus监控实战》 去年写了一篇在Docker环境下部署若依微服务ruoyi-cloud项目的文章&#xff0c;当…...

软考教材重点内容 信息安全工程师 第 4 章 网络安全体系与网络安全模型

4,1 网络安全体系的主要特征: (1)整体性。网络安全体系从全局、长远的角度实现安全保障&#xff0c;网络安全单元按照一定的规则&#xff0c;相互依赖、相互约束、相互作用而形成人机物一体化的网络安全保护方式。 (2)协同性。网络安全体系依赖于多种安全机制&#xff0c;通过各…...

机器学习——期末复习 重点题归纳

第一题 问题描述 现有如下数据样本&#xff1a; 编号色泽敲声甜度好瓜1乌黑浊响高是2浅白沉闷低否3青绿清脆中是4浅白浊响低否 &#xff08;1&#xff09;根据上表&#xff0c;给出属于对应假设空间的3个不同假设。若某种算法的归纳偏好为“适应情形尽可能少”&#xff0c;…...

MYSQL——数据更新

一、插入数据 1.插入完整的数据记录 在MYSQL中&#xff0c;使用SQL语句INSERT插入一条完整的记录&#xff0c;语法如下&#xff1a; INSERT INTO 表名 [(字段名1[,...字段名n])] VALUES (值1[...,值n]); 表名——用于指定要插入的数据的表名 字段名——用于指定需要插入数据…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...