首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

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

  • 25-03-07 19:03
  • 2262
  • 13230
blog.csdn.net

【华为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
  • 1
  • 2
输出:
2
  • 1
用例二:
输入:
abc
s,sdf134 A2c4bd 523[]
  • 1
  • 2
输出:
1
  • 1

python解法

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

具体匹配条件:

对 key 按字母排序。
对每个箱子,过滤出其中的字母字符,转换为小写后排序。
比较 key 的排序结果和当前箱子过滤后排序的结果是否相同

# 读取输入 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))

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

java解法

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

代码分为三个主要部分:

字符串预处理:过滤非字母字符,将字母转换为小写,并按字母顺序排序。
匹配逻辑:将 referenceKey 和每个容器经过相同的预处理后进行比较。
输出结果:根据匹配结果输出第一个匹配容器的索引或 -1。

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
    }
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56

C++解法

  • 解题思路
更新中
  • 1

C解法

  • 解题思路

更新中
  • 1

JS解法

  • 解题思路

更新中
  • 1

注意:

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

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/144533802"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top