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

news2025/1/13 14:50:03

【华为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]); // 第一行是索引 k
            const 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.coloradmin.cn/o/2276006.html

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

相关文章

实用操作系统学习笔记

第1章 操作系统概述 操作系统基本概念 【基础知识】 操作系统&#xff1a;控制和管理整个计算机系统的硬件和软件资源&#xff0c;合理地组织、调度计算机的工作与资源的分配&#xff0c;进而为用户和其他软件提供方便接口与环境的程序集合。操作系统是计算机系统中最基本的…

银河麒麟桌面操作系统搭建FTP服务器

一、操作环境 服务端&#xff1a;银河麒麟桌面操作系统V10 客户端&#xff1a;银河麒麟桌面操作系统V10 二、服务器配置 说明&#xff1a;以下命令均在终端执行。鼠标点击桌面右键&#xff0c;在终端中打开。 操作步骤&#xff1a; &#xff08;一&#xff09;安装vsftpd…

20250112面试鸭特训营第20天

更多特训营笔记详见个人主页【面试鸭特训营】专栏 250112 1. TCP 和 UDP 有什么区别&#xff1f; 特性TCPUDP连接方式面向连接&#xff08;需要建立连接&#xff09;无连接&#xff08;无需建立连接&#xff09;可靠性可靠的&#xff0c;提供确认、重传机制不可靠&#xff0c…

深入理解 C 语言中浮点型数据在内存中的存储

文章目录 一、浮点型数据存储格式&#xff08;IEEE 754 标准&#xff09;二、举例说明单精度浮点数存储过程三、绘图说明四、双精度浮点数存储示例&#xff08;以1.5为例&#xff09; 在 C 语言的世界里&#xff0c;数据类型丰富多样&#xff0c;而浮点型数据用于表示实数&…

使用uniapp 微信小程序一些好用的插件分享

总结一下自己在开发中遇见的一问题&#xff0c;通过引入组件可以快速的解决 1.zxz-uni-data-select 下拉框选择器(添加下拉框检索&#xff0c;多选功能&#xff0c;多选搜索功能&#xff0c;自定义 下拉框插件&#xff0c;使用这个的原因是因为 uniui uview 组件库下拉框太…

kafka消费堆积问题探索

背景 我们的商城项目用PHP写的&#xff0c;原本写日志方案用的是PHP的方案&#xff0c;但是&#xff0c;这个方案导致资源消耗一直降不下来&#xff0c;使用了20个CPU。后面考虑使用通过kafka的方案写日志&#xff0c;商城中把产生的日志丢到kafka中&#xff0c;在以go写的项目…

使用conda出现requests.exceptions.HTTPError 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

智能化文档开发(DI)

这个文档涉及到多模态&#xff08;文本、发票、订单、语音&#xff09; 对于普通的文本&#xff0c;我们希望对某些实体的某些属性挖空生成文档模版&#xff0c;并根据预设字段填空最后生成正式文件对于发票、订单&#xff0c;我们想提取它的字段信息&#xff0c;写入DB对于一些…

RAID储存技术

RAID独立磁盘冗余技术是一种把2个或者多个HDD或SSD合并为一个协调的存储单元或列阵&#xff0c;从而预防数据丢失的技术&#xff0c;其最早由加州大学伯克利分校的计算机科学家David Patterson、Garth Gibson和Randy Katz在1987年提出。他们的研究论文“关于RAID的论证”提出了…

Java Web开发基础:HTML的深度解析与应用

文章目录 前言&#x1f30d;一.B/S 软件开发架构简述&#x1f30d;二.HTML 介绍❄️2.1 官方文档❄️2.2 网页的组成❄️2.3 HTML 是什么❄️2.4html基本结构 &#x1f30d;三.HTML标签1.html 的标签/元素-说明2. html 标签注意事项和细节3.font 字体标签4.标题标签5.超链接标签…

使用 WPF 和 C# 绘制图形

绘图困难 此示例展示了如何在 WPF 和 C# 中绘制图形。绘制图形总是很棘手&#xff0c;因为您通常需要在至少两个不同的坐标系中工作。首先&#xff0c;您要为图形使用世界坐标。例如&#xff0c;您可能希望 X 值的范围为 2000 年至 2020 年&#xff0c;Y 值的范围为 10,000 美元…

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

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

【JVM-2.3】深入解析JVisualVM:Java性能监控与调优利器

在Java应用的开发和运维过程中&#xff0c;性能监控与调优是不可或缺的环节。无论是排查内存泄漏、分析CPU瓶颈&#xff0c;还是优化线程使用&#xff0c;开发者都需要借助一些强大的工具来辅助诊断。JVisualVM 正是这样一款由Oracle提供的免费工具&#xff0c;它集成了多种性能…

filestream安装使用全套+filebeat的模块用法

1 filestream介绍 官方宣布&#xff1a;输入类型为log在filebeat7.16版本已经弃用了 Filestream 是 Filebeat 中的一种 输入类型&#xff08;Input&#xff09;&#xff0c;用于处理日志文件的读取。它是为了取代 Filebeat 中传统的 log 输入&#xff08;Input&#xff09;设…

超燃预告!Origin百图绘制系列即将登场

Hello&#xff0c;大家好 这里是练习时长两年半的菜狗~ 持续更新各种竞赛&#xff0c;科研&#xff0c;保研&#xff0c;学习干货ing 回想刚开始打比赛那会&#xff0c;啥都不懂&#xff0c;就从用 Excel 画图起步&#xff0c;绘制的图形实在太难看。后来运用 Matlab&#xf…

八、系统托盘与配置面板

没有人会把你变得越来越好&#xff0c;时间和经历只是陪衬。 支撑你变得越来越好的&#xff0c;是你自己坚强的意志、修养、品行、以及不断的反思和经验。 人生最好的贵人&#xff0c;就是努力向上的自己。 一、系统托盘 1、资源文件夹 新建资源文件夹&#xff0c;我们需要把…

uniapp 之 uni-forms校验提示【提交的字段[‘xxx‘]在数据库中并不存在】解决方案

目录 场景问题代码结果问题剖析解决方案 场景 uni-forms官方组件地址 使用uniapp官方提供的组件&#xff0c;某个表单需求&#xff0c;单位性质字段如果是高校&#xff0c;那么工作单位则是高校的下拉选择格式&#xff0c;单位性质如果是其他的类型&#xff0c;工作单位则是手动…

Java面试核心知识4

公平锁与非公平锁 公平锁&#xff08;Fair&#xff09; 加锁前检查是否有排队等待的线程&#xff0c;优先排队等待的线程&#xff0c;先来先得 非公平锁&#xff08;Nonfair&#xff09; 加锁时不考虑排队等待问题&#xff0c;直接尝试获取锁&#xff0c;获取不到自动到队尾…

基于 SSH 的任务调度系统

文末附有完整项目代码 在当今科技飞速发展的时代&#xff0c;任务调度系统的重要性日益凸显。本文将详细介绍一个基于 SSH&#xff08;SpringStruts2Hibernate&#xff09;的任务调度系统的设计与实现。 一、系统概述 本系统旨在改变传统人工任务调度方式&#xff0c;通过计算…

我的128天创作之路:回顾与展望

大家好呀&#xff01;今天来和你们分享一下我的创作历程&#x1f601;。 一、机缘 最开始创作呢&#xff0c;是因为在学习 C 的 STL 时&#xff0c;像 string、list、vector 这些模板可把我折腾得够呛&#xff0c;但也让我学到了超多东西&#xff01;我就想&#xff0c;要是把我…