【华为OD-E卷 - 敏感字段加密 100分(python、java、c++、js、c)】

【华为OD-E卷 - 敏感字段加密 100分(python、java、c++、js、c)】

题目

给定一个由多个命令字组成的命令字符串:
字符串长度小于等于127字节,只包含大小写字母,数字,下划线和偶数个双引号; 命令字之间以一个或多个下划线_进行分割; 可以通过两个双引号””来标识包含下划线_的命令字或空命令字(仅包含两个双引号的命令字),双引号不会在命令字内部出现; 请对指定索引的敏感字段进行加密,替换为
****(6个*),并删除命令字前后多余的下划线_。 如果无法找到指定索引的命令字,输出字符串ERROR**

输入描述

  • 输入为两行,第一行为命令字索引K(从0开始),第二行为命令字符串S

输出描述

  • 输出处理后的命令字符串,如果无法找到指定索引的命令字,输出字符串ERROR

用例

用例一:
输入:
1
password__a12345678_timeout_100
输出:
password_******_timeout_100
用例二:
输入:
password_******_timeout_100
输出:
aaa_password_******_timeout_100_""

python解法

  • 解题思路:
  • 这段代码的目标是处理一段字符串,根据输入的索引 k,将字符串中的第 k 个部分替换为 “******”,并返回替换后的字符串。字符串的分割规则如下:

分割规则:
双引号内的内容作为一个整体,不会被进一步分割。
其他部分根据下划线 _ 分割。
索引范围检查:
如果 k 超出分割后的部分数量,返回 “ERROR”。
替换部分:
将索引为 k 的部分替换为 “******”。
重新拼接字符串:
使用下划线 _ 将处理后的部分重新拼接成一个字符串。

import re# 输入参数
k = int(input())  # 要替换的部分索引
s = input()       # 输入的字符串# 处理字符串的函数
def process_command(k, s):# 使用正则表达式分割字符串# pattern:# - `"[^"]*"` 匹配双引号内的内容,包括引号# - `|` 表示或# - `[^_]+` 匹配非下划线的连续字符pattern = re.compile(r'"[^"]*"|[^_]+')matches = pattern.findall(s)  # 查找所有匹配的部分# 检查索引 k 是否有效if k >= len(matches):  # 如果 k 超出范围return "ERROR"     # 返回错误信息# 将第 k 个部分替换为 "******"matches[k] = "******"# 使用下划线将所有部分重新拼接成字符串return "_".join(matches)# 调用函数并输出结果
print(process_command(k, s))

java解法

  • 解题思路
  • 这段代码的目标是处理一段字符串,根据输入的索引 idx,将字符串中的第 idx 个部分替换为 “******”,并返回替换后的结果。如果 idx 超出字符串的部分数量,返回 “ERROR”。字符串的分割规则如下:

分割规则:
双引号内的内容作为一个整体,不会被进一步分割。
其他部分根据下划线 _ 分割。
索引范围检查:
如果 idx 超出分割后的部分数量,返回 “ERROR”。
替换部分:
将索引为 idx 的部分替换为 “******”。
重新拼接字符串:
使用下划线 _ 将所有部分重新拼接成一个字符串

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in); // 创建 Scanner 对象读取输入int idx = Integer.parseInt(in.nextLine()); // 读取第一个输入行作为索引String cmd = in.nextLine(); // 读取第二个输入行作为字符串System.out.println(procCmd(idx, cmd)); // 调用处理函数并输出结果}// 处理命令字符串public static String procCmd(int idx, String cmd) {// 定义正则表达式:// - `\"[^\"]*\"` 匹配双引号内的内容,包括双引号// - `[^_]+` 匹配非下划线的连续字符Pattern pat = Pattern.compile("\"[^\"]*\"|[^_]+");Matcher mat = pat.matcher(cmd); // 使用正则表达式匹配输入字符串StringBuilder res = new StringBuilder(); // 用于存储结果字符串int cnt = 0; // 记录当前部分的索引while (mat.find()) { // 遍历所有匹配的部分if (cnt++ == idx) { // 如果当前部分的索引等于目标索引res.append("******"); // 替换为 "******"} else {res.append(mat.group()); // 否则将原始部分加入结果}res.append("_"); // 在每部分后添加下划线}// 检查索引是否超出范围if (idx >= cnt) {return "ERROR"; // 如果目标索引大于等于总部分数,返回 "ERROR"}// 删除结果末尾多余的下划线并返回return res.substring(0, res.length() - 1);}
}

C++解法

  • 解题思路
  • 这段代码的目标是根据输入的索引 index,将字符串中的第 index 个部分替换为 “******”,并输出处理后的字符串。如果 index 超出了分割部分的数量,输出 “ERROR”。

字符串分割规则:

双引号包裹的内容:
双引号中的内容被视为一个整体,不会被分割。
双引号可以成对出现,也可以嵌套字符。
下划线 _ 分割部分:
未被双引号包裹的内容以下划线 _ 为分隔符分割为多个部分。
处理步骤:

遍历字符串,维护一个临时变量 part 用于存储当前部分。
使用标志变量 insideQuotes 记录当前是否在双引号范围内。
每当遇到下划线 _ 且不在双引号范围时,将当前部分加入结果,并根据索引判断是否替换为 “******”。
遍历结束后,处理最后一部分内容。
检查是否超出索引范围:
如果超出范围,输出 “ERROR”。
如果未超出范围,输出拼接后的结果。

#include <iostream>
#include <string>int main() {int index; // 用于存储输入的目标索引std::cin >> index; // 读取目标索引std::string line;std::cin.ignore(); // 忽略上一次输入的换行符std::getline(std::cin, line); // 读取完整的一行字符串std::string part; // 用于存储当前解析的部分int count = 0; // 记录当前部分的索引bool insideQuotes = false; // 标记当前是否在双引号范围内std::string result; // 用于存储最终的拼接结果// 遍历整个字符串for (size_t i = 0; i < line.size(); ++i) {if (line[i] == '\"') {// 遇到双引号时切换 insideQuotes 状态insideQuotes = !insideQuotes;part.push_back(line[i]); // 将双引号加入当前部分}else if (!insideQuotes && line[i] == '_') {// 遇到下划线且不在双引号范围时if (!part.empty()) { // 当前部分非空if (count == index) { // 如果当前部分是目标索引result += "******"; // 替换为 "******"}else {result += part; // 否则加入原部分}result += "_"; // 添加下划线分隔符count++; // 增加部分计数part.clear(); // 清空当前部分}}else {part.push_back(line[i]); // 将字符加入当前部分}}// 处理最后一部分if (!part.empty()) { // 如果最后一部分非空if (count == index) {result += "******"; // 替换为 "******"}else {result += part; // 加入原部分}}else if (result.back() == '_') {result.pop_back(); // 删除结果末尾多余的下划线}// 检查是否超出索引范围if (count >= index) {std::cout << result << std::endl; // 输出处理后的结果}else {std::cout << "ERROR" << std::endl; // 索引超出范围时输出 "ERROR"}return 0;
}

C解法

  • 解题思路

更新中

JS解法

  • 解题思路

  • 这段代码实现了一个命令处理器,用于处理两个输入:

输入的第一个行:一个整数 k,表示要替换的部分索引。
输入的第二行:一个命令字符串,由 "_” 分隔多个部分,部分内容可能用双引号 " 包裹,双引号包裹的内容视为一个整体。
目标是:

按规则解析命令字符串。
如果索引 k 超出解析的部分数量,返回 “ERROR”。
否则,将索引为 k 的部分替换为 “******”,并返回处理后的字符串。

const readline = require("readline");// 创建 CommandProcessor 类
class CommandProcessor {constructor() {this.lines = []; // 用于存储输入的两行内容}// 处理输入,每次读取一行processInput(line) {this.lines.push(line); // 将当前行添加到 `lines`if (this.lines.length === 2) { // 当读取到两行时开始处理const k = parseInt(this.lines[0]); // 第一行是索引 kconst commandStr = this.lines[1]; // 第二行是命令字符串console.log(this.encryptSensitiveField(commandStr, k)); // 输出处理结果this.lines.length = 0; // 重置 `lines`,以便处理下一组输入}}// 将索引为 `index` 的部分替换为 "******"encryptSensitiveField(commandStr, index) {const commandList = this.parseCommands(commandStr); // 解析命令字符串为部分列表if (index >= commandList.length) { // 如果索引超出部分数量,返回 "ERROR"return "ERROR";}commandList[index] = "******"; // 替换目标部分为 "******"return commandList.join("_"); // 使用下划线将部分拼接为字符串返回}// 解析命令字符串为部分列表parseCommands(str) {let parts = []; // 存储解析后的部分let current = []; // 存储当前部分的字符for (let i = 0; i < str.length; i++) {if (str[i] === "_" && current[0] !== '"') {// 遇到下划线且当前部分不在双引号内时,将当前部分加入列表parts.push(current.join(""));current = [];} else if (str[i] === '"' && current.length !== 0) {// 遇到双引号且当前部分非空时,结束当前部分并加入列表parts.push(current.join("") + '"');current = [];} else {current.push(str[i]); // 将字符加入当前部分}}if (current.length) parts.push(current.join("")); // 处理最后一部分return parts.filter((part) => part !== ""); // 过滤掉空部分}
}// 创建 `readline` 接口,用于读取输入
const rl = readline.createInterface({input: process.stdin,output: process.stdout,
});// 创建命令处理器实例
const processor = new CommandProcessor();// 监听每行输入
rl.on("line", (line) => {processor.processInput(line); // 调用 `processInput` 处理当前输入行
});

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏

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

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

相关文章

Vue3学习-day3

computed计算属性函数 计算属性小案例 App.vue <script setup> import { ref, computed } from vue// 声明数据 const list ref([1,2,3,4,5,6,7,8])// 基于list派生一个计算属性&#xff0c;从list中过滤出 > 2 const setList computed(() > {return list.val…

【博主推荐】VUE常见问题及解决方案

文章目录 1.找不到模块“../views/index.vue”或其相应的类型声明。ts(2307)2.当改变 Vue 实例中的数据时&#xff0c;视图没有相应地更新3.在某些复杂的异步操作或者多个数据交互场景下&#xff0c;数据绑定的更新在时间上出现延迟4.父组件无法将数据正确地传递给子组件&#…

完整化安装kubesphere,ks-jenkins的状态一直为init

错误描述&#xff1a; 打印日志&#xff1a; kubectl describe pod ks-jenkins-7fcff7857b-gh4g5 -n kubesphere-devops-system 日志描述如下&#xff1a; Events: Type Reason Age From Message ---- ------ ---- …

1.UGUI相关

1.这一种UIcanvas下的组件,会显示在3d物体之前 2.可以设置3d物体在UI界面之前。选中第二个模式。这时候会指定一个摄像机。一般情况下&#xff0c;不用主摄像机。需要新建一个专门给UI的摄像机。相当于设置距离摄像机的远近。两个layer 可以理解成 章节&#xff0c;关卡。相同…

OSPF - 2、3类LSA(Network-LSA、NetWork-Sunmmary-LSA)

前篇博客有对常用LSA的总结 2类LSA&#xff08;Network-LSA&#xff09; DR产生泛洪范围为本区域 作用:  描述MA网络拓扑信息和网络信息&#xff0c;拓扑信息主要描述当前MA网络中伪节点连接着哪几台路由。网络信息描述当前网络的 掩码和DR接口IP地址。 影响邻居建立中说到…

【数模学习笔记】插值算法和拟合算法

声明&#xff1a;以下笔记中的图片以及内容 均整理自“数学建模学习交流”清风老师的课程资料&#xff0c;仅用作学习交流使用 文章目录 插值算法定义三个类型插值举例插值多项式分段插值三角插值 一般插值多项式原理拉格朗日插值法龙格现象分段线性插值 牛顿插值法 Hermite埃尔…

1.2 WSL中安装Centos7

官网链接使用 WSL 访问网络应用程序 | Microsoft Learn 一、Win安装WSL配置 WSL官网链接使用 WSL 访问网络应用程序 | Microsoft Learn 1.1 命令模式开启虚拟化设置步骤 # 启用适用于 Linux 的 Windows 子系统&#xff1a;打开powershell并输入&#xff1a; dism.exe /onli…

有收到腾讯委托律师事务所向AppStore投诉带有【水印相机】主标题名称App的开发者吗

近期&#xff0c;有多名开发者反馈&#xff0c;收到来自腾讯科技 (深圳) 有限公司委托北京的一家**诚律师事务所卞&#xff0c;写给AppStore的投诉邮件。 邮件内容主要说的是&#xff0c;腾讯注册了【水印相机】这四个字的商标&#xff0c;所以你们这些在AppStore上的app&…

linux网络 | https前置知识 | 数据加密与解密、数据摘要

前言:本节内容讲述https的相关内容。 https博主会着重讲解https如何让一个请求和一个响应能够安全的进行交互。 https博主将用两篇文章进行讲解。本篇是两篇中第一篇。会把http的安全问题引出来&#xff0c; 然后说一下https的基本解决方法。 下面废话不多说&#xff0c; 开始我…

安科瑞 Acrel-1000DP 分布式光伏监控系统在工业厂房分布式光伏发电项目中的应用

吕梦怡 18706162527 摘 要&#xff1a;常规能源以煤、石油、天然气为主&#xff0c;不仅资源有限&#xff0c;而且会造成严重的大气污染&#xff0c;开发清洁的可再生能源已经成为当今发展的重要任务&#xff0c;“节能优先&#xff0c;效率为本”的分布式发电能源符合社会发…

视频编辑最新SOTA!港中文Adobe等发布统一视频生成传播框架——GenProp

文章链接&#xff1a;https://arxiv.org/pdf/2412.19761 项目链接&#xff1a;https://genprop.github.io 亮点直击 定义了一个新的生成视频传播问题&#xff0c;目标是利用 I2V 模型的生成能力&#xff0c;将视频第一帧的各种变化传播到整个视频中。 精心设计了模型 GenProp&…

年度技术突破奖|中兴微电子引领汽车芯片新变革

随着以中央计算区域控制为代表的新一代整车电子架构逐步成为行业主流&#xff0c;车企在电动化与智能化之后&#xff0c;正迎来以架构创新为核心的新一轮技术竞争。中央计算SoC&#xff0c;作为支撑智驾和智舱高算力需求的核心组件&#xff0c;已成为汽车电子市场的重要新增量。…

后门原理与实践

实验目录 windows主机与kali虚拟机实现互联互通使用netcat获取主机操作Shell&#xff0c;cron启动使用socat获取主机操作Shell, 任务计划启动使用MSF meterpreter生成可执行文件&#xff0c;利用ncat或socat传送到主机并运行获取主机Shell使用MSF meterpreter生成获取目标主机…

Apache Hop从入门到精通 第一课 揭开Apache Hop神秘面纱

一、Apache Hop是什么&#xff1f; 1、Apache Hop&#xff0c;简称Hop&#xff0c;全称为Hop Orchestration Platform&#xff0c;即Hop 工作编排平台&#xff0c;是一个数据编排和数据工程平台&#xff0c;旨在促进数据和元数据编排的所有方面。Hop让你专注于你想要解决的问题…

嵌入式C语言:什么是指针?

目录 一、指针的基本概念 1.1. 定义指针 1.2. 赋值给指针 1.3. 解引用指针 1.4. 指针运算 1.5. 空指针 1.6. 函数参数 1.7. 数组和指针 1.8. 示例代码 二、指针在内存中的表示 2.1. 内存地址存储 2.2. 内存模型 2.3. 指针与硬件交互 2.4. 示例代码 三 、指针的重…

带格式 pdf 翻译

支持 openAI 接口&#xff0c;国内 deepseek 接口兼容 openAI 接口&#xff0c; deepseek api 又非常便宜 https://pdf2zh.com/ https://github.com/Byaidu/PDFMathTranslate

【redis初阶】初识Redis

目录 一、初识Redis 二、盛赞 Redis 三、Redis 特性 3.1 速度快 ​编辑3.2 基于键值对的数据结构服务器 3.3 丰富的功能 3.4 简单稳定 &#x1f436; 3.6 持久化&#xff08;Persistence&#xff09; 3.7 主从复制&#xff08;Replication&#xff09; 3.8 高可用&#xff08;H…

虚拟机Linux Red Hat 7.9 Docker部署.Net 7 Zr.Admin项目(后端)

0、环境信息 应用部署在虚拟机里的docker&#xff0c;里面的应用访问宿主主机的MySQL 1、开启MySQL远程访问 使用非安装版MySQL参考Windows 使用 非安装版MySQL 8 为了避免出现 Host is not allowed to connect to this MySQL server 使用root用户登录 cmd进入到MySQL的bi…

UE小白学习日记

Level UE中的Level(关卡)和Unity中的Scene(场景)在概念和用途上非常相似,都是用来组织和管理3D环境的基本单位。让我为您详细对比一下: 相似之处: 它们都是游戏世界的容器,可以包含游戏对象、光照、地形等元素都支持场景/关卡的切换和加载都可以用来划分游戏内容,比如不同关…

cmake - build MS STL project

文章目录 cmake - build MS STL project概述笔记END cmake - build MS STL project 概述 MS在github上开源了VS IDE 用的STL实现。 想看看微软的测试用例中怎么用STL. 想先用CMake编译一个MS STL发布版出来。 笔记 CMake需要3.30以上, 拟采用 cmake-3.30.6-windows-x86_64.…