【华为OD-E卷-寻找关键钥匙 100分(python、java、c++、js、c)】

【华为OD-E卷-寻找关键钥匙 100分(python、java、c++、js、c)】

题目

小强正在参加《密室逃生》游戏,当前关卡要求找到符合给定 密码K(升序的不重复小写字母组成) 的箱子,并给出箱子编号,箱子编号为 1~N 。
每个箱子中都有一个 字符串s ,字符串由大写字母、小写字母、数字、标点符号、空格组成,需要在这些字符串中找到所有的字母,忽略大小写后排列出对应的密码串,并返回匹配密码的箱子序号。
提示:满足条件的箱子不超过1个。

输入描述

  • 第一行为 key 的字符串,

第二行为箱子 boxes,为数组样式,以空格分隔

箱子 N 数量满足 1 ≤ N ≤ 10000, s 长度满足 0 ≤ s.length ≤ 50, 密码为仅包含小写字母的升序字符串,且不存在重复字母, 密码 K 长度1 ≤ K.length ≤ 26

输出描述

  • 返回对应箱子编号

如不存在符合要求的密码箱,则返回 -1。

备注

  • 箱子中字符拼出的字符串与密码的匹配忽略大小写,且要求与密码完全匹配,如密码abc匹配aBc,但是密码abc不匹配abcd

用例

用例一:
输入:
abc
s,sdf134 A2c4b
输出:
2
用例二:
输入:
abc
s,sdf134 A2c4bd 523[]
输出:
1

python解法

  • 解题思路:
  • 这段代码的目标是从一组字符串(boxes)中找到第一个可以和输入的 key 匹配的箱子(匹配条件是两个字符串的字符可以完全重排成彼此,忽略大小写和非字母字符)。匹配时返回箱子的索引(从 1 开始),如果找不到匹配则返回 -1。

具体匹配条件:

对 key 按字母排序。

对每个箱子,过滤出其中的字母字符,转换为小写后排序。

比较 key 的排序结果和当前箱子过滤后排序的结果是否相同

python 复制代码
# 读取输入 key 和 boxes 列表
key = input()  # 匹配的关键字符串
boxes = input().split()  # 多个箱子名称,以空格分隔

def find_box_index(key, boxes):
    key_sorted = sorted(key)  # 对 key 字符串排序,作为匹配基准
    for i, box in enumerate(boxes):  # 遍历所有箱子
        # 过滤箱子中的字母字符,并转换为小写
        filtered_chars = [c.lower() for c in box if c.isalpha()]
        # 检查过滤后的字符排序是否与 key 的排序相同
        if key_sorted == sorted(filtered_chars):
            return i + 1  # 返回匹配箱子的索引(从 1 开始)
    return -1  # 如果没有匹配,返回 -1

# 输出结果
print(find_box_index(key, boxes))

java解法

  • 解题思路
  • 这段代码的目标是从一组字符串(containers)中找到第一个可以与输入字符串 referenceKey 匹配的容器。匹配的条件是两个字符串的字符完全相同(忽略大小写和非字母字符),且字符顺序无关。匹配时返回容器的索引(从 1 开始),如果找不到匹配则返回 -1。

代码分为三个主要部分:

字符串预处理:过滤非字母字符,将字母转换为小写,并按字母顺序排序。

匹配逻辑:将 referenceKey 和每个容器经过相同的预处理后进行比较。

输出结果:根据匹配结果输出第一个匹配容器的索引或 -1。

java 复制代码
import java.util.Scanner;
import java.util.Arrays;

public class Main {

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

        // 读取输入,预处理 referenceKey
        String referenceKey = sanitizeAndSort(scanner.nextLine());

        // 读取 containers 列表,按空格分隔
        String[] containers = scanner.nextLine().split(" ");

        // 查找匹配索引
        int matchingIndex = findMatchIndex(referenceKey, containers);

        // 输出匹配结果
        System.out.println(matchingIndex);
    }

    /**
     * 预处理字符串:过滤非字母字符,转为小写,并排序
     *
     * @param input 原始字符串
     * @return 经过排序和过滤后的字符串
     */
    private static String sanitizeAndSort(String input) {
        // 去除非字母字符,转小写,转为字符数组
        char[] filteredChars = input.replaceAll("[^a-zA-Z]", "").toLowerCase().toCharArray();
        // 对字符数组排序
        Arrays.sort(filteredChars);
        // 转为字符串返回
        return new String(filteredChars);
    }

    /**
     * 在 containers 中查找第一个匹配 referenceKey 的索引
     *
     * @param referenceKey 预处理后的参考字符串
     * @param containers 容器字符串数组
     * @return 第一个匹配的容器索引(从 1 开始),未找到返回 -1
     */
    private static int findMatchIndex(String referenceKey, String[] containers) {
        for (int i = 0; i < containers.length; i++) {
            // 预处理当前容器
            String sortedBox = sanitizeAndSort(containers[i]);
            // 比较参考字符串与当前容器是否匹配
            if (referenceKey.equals(sortedBox)) {
                return i + 1; // 返回 1 基索引
            }
        }
        return -1; // 没有找到匹配,返回 -1
    }
}

C++解法

  • 解题思路
cpp 复制代码
更新中

C解法

解题思路

c 复制代码
更新中

JS解法

解题思路

javascript 复制代码
更新中

注意:

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

相关推荐
m0_74824877几秒前
第五章springboot实现web的常用功能
java
四口鲸鱼爱吃盐7 分钟前
Pytorch | 利用MI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
人工智能·pytorch·python
重整旗鼓~8 分钟前
32.多线程线程
python
葡萄架子8 分钟前
Python中的正则表达式
python·mysql·正则表达式
Wils0nEdwards17 分钟前
Leetcode 串联所有单词的子串
java·算法·leetcode
zybishe19 分钟前
免费送源码:Java+ssm++MVC+HTML+CSS+MySQL springboot 社区医院信息管理系统的设计与实现 计算机毕业设计原创定制
java·hadoop·sql·zookeeper·html·json·mvc
CodeClimb23 分钟前
【华为OD-E卷-预订酒店 100分(python、java、c++、js、c)】
java·python·华为od
豆芽脚脚34 分钟前
python打包exe文件
linux·开发语言·python
toto4121 小时前
Java中的锁机制 与 synchronized的理解
java·算法
潜意识起点1 小时前
使用 JDBC 实现 Java 数据库操作
java·开发语言·数据库