华为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
华为OD机试真题-学生重新排队是一个典的编程问题,下面是问题和解决路: 问题描述: 有n个学生站成一排,每个学生都有一个独一无二身份ID。现在给定一个初始的学生排列顺序,以及一系列的交换操作,交换操作表示将两个学生的位置进行交换。请你编写一个算法,输出最终的学生排列顺序。 解决思路: 这个问题可以使用数组来表示学生的排列顺序。首先,我们需要根据初始的学生排列顺序构建一个映射表,将每个学生的ID与其在数组中的位置对应起来。然后,我们按照给定的交换操作,更新映射表中学生的位置信息。最后,根据更新后的映射表,构建最终的学生排列顺序。 具体步骤如下: 1. 构建映射表:遍历初始的学生排列顺序,将每个学生的ID与其在数组中的位置对应起来,可以使用哈希表来实现。 2. 执行交换操作:按照给定的交换操作,更新映射表中学生的位置信息。 3. 构建最终的学生排列顺序:根据更新后的映射表,构建最终的学生排列顺序。 下面是一个示例代码,用于解决这个问题: ```python def rearrange_students(initial_order, swap_operations): # 构建映射表 mapping = {} for i, student_id in enumerate(initial_order): mapping[student_id] = i # 执行交换操作 for swap in swap_operations: student1, student2 = swap mapping[student1], mapping[student2] = mapping[student2], mapping[student1] # 构建最终的学生排列顺序 final_order = [0] * len(initial_order) for student_id, position in mapping.items(): final_order[position] = student_id return final_order ``` 使用上述代码,你可以通过传入初始的学生排列顺序和交换操作,得到最终的学生排列顺序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值