【华为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
更新中
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏