华为OD机试真题---敏感字段加密


一、题目描述

给定一个由多个命令字组成的命令字符串,要求对指定索引的敏感字段进行加密处理。命令字之间以一个或多个下划线“_”分隔。两个双引号““””可用来标识包含下划线的命令字或空命令字(即仅包含两个双引号的命令字)。双引号不会在命令字内部出现。敏感字段加密后,需要将其替换为“******”(6个星号),并删除命令字前后多余的下划线。如果无法找到指定索引的命令字,则输出字符串“ERROR”。

二、输入格式

输入包含两行:

  1. 第一行为一个整数,表示要加密的命令字索引(从0开始)。
  2. 第二行为命令字符串。

三、输出格式

输出一行字符串,为处理后的命令字符串。如果无法找到指定索引的命令字,输出“ERROR”。

四、解题思路

  1. 解析命令字符串

    • 遍历命令字符串,使用布尔变量in_quotes来跟踪当前是否在引号内。
    • 当遇到双引号时,切换in_quotes的状态。
    • 当不在引号内且遇到下划线时,表示一个命令字的结束。
    • 将字符添加到当前命令字中,直到遇到命令字结束的标志(下划线且不在引号内)。
  2. 存储命令字

    • 使用列表或数组来存储解析出的命令字。
  3. 检查索引有效性

    • 在替换命令字之前,检查给定的索引是否有效(是否在命令字列表的范围内)。
    • 如果索引无效,直接返回“ERROR”。
  4. 加密指定索引的命令字

    • 将指定索引的命令字替换为“******”。
  5. 重新组合命令字符串

    • 使用下划线连接处理后的命令字列表。
    • 去除结果字符串首尾的多余下划线。

五、代码实现(Java)


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class SensitiveFieldEncryption {

/**
 * 处理命令字符串,将其中指定位置的单词替换为掩码
 *
 * @param index 需要替换的单词的索引位置
 * @param command 命令字符串,包含用下划线分隔的单词,单词可能包含双引号
 * @return 处理后的字符串,如果输入无效则返回"ERROR"
 */
public static String processCommand(int index, String command) {
    // 检查命令字符串是否为空或无效
    if (command == null || command.isEmpty()) {
        return "ERROR";
    }

    List<String> words = new ArrayList<>();
    StringBuilder currentWord = new StringBuilder();
    boolean inQuotes = false;

    // 遍历命令字符串的每个字符
    for (int i = 0; i < command.length(); i++) {
        char ch = command.charAt(i);

        // 处理引号,切换 inQuotes 标志,并将引号添加到当前单词
        if (ch == '"') {
            inQuotes = !inQuotes;
            currentWord.append(ch);
        }
        // 当不在引号内且遇到下划线时,将当前单词添加到列表中,并重置当前单词
        else if (ch == '_' && !inQuotes) {
            if (currentWord.length() > 0) {
                words.add(currentWord.toString());
                currentWord.setLength(0);
            }
        }
        // 其他字符直接添加到当前单词
        else {
            currentWord.append(ch);
        }
    }

    // 检查引号是否成对出现
    if (inQuotes) {
        return "ERROR"; // 引号未闭合
    }

    // 将最后一个单词添加到列表中
    if (currentWord.length() > 0) {
        words.add(currentWord.toString());
    }

    // 检查索引是否在有效范围内
    if (index < 0 || index >= words.size()) {
        return "ERROR";
    }

    // 将指定索引位置的单词替换为掩码
    words.set(index, "******");

    // 将单词列表重新连接成字符串,用下划线分隔
    String joinedWords = String.join("_", words);
    // 移除字符串开头和结尾的下划线
    String trimmedResult = joinedWords.replaceAll("^_+|_+$", "");

    return trimmedResult;
}



    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取索引
        int index = scanner.nextInt();
        scanner.nextLine(); // 消耗换行符

        // 读取命令字符串
        String command = scanner.nextLine();

        // 处理命令并输出结果
        String result = processCommand(index, command);
        System.out.println(result);

        scanner.close();
    }
}

六、注意事项

  1. 输入验证:在实际应用中,应增加对输入的验证,确保输入符合题目要求。
  2. 性能考虑:对于较长的命令字符串,算法的性能应足够高效,以避免超时。
  3. 边界情况处理:需要处理空字符串、只有下划线的字符串以及带引号的空单词等边界情况。

当然,以下是一个运行示例,展示了如何使用上述Java代码来加密命令字符串中的敏感字段。


七、运行示例

输入

1
run_command "sensitive_data" _another_command
解释
  • 1 是要加密的字段的索引(基于0的索引)。
  • run_command "sensitive_data" _another_command 是要处理的命令字符串。
处理过程
  1. 解析命令字符串,得到以下单词列表(考虑引号):

    • run_command
    • "sensitive_data"
    • _another_command
  2. 检查索引 1 是否有效。在这个例子中,索引是有效的,因为它指向了第二个单词("sensitive_data")。

  3. 将索引 1 处的单词替换为 "******"

  4. 重新组合命令字符串,得到:

    • run_command ****** _another_command
输出
run_command ****** _another_command
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值