2024华为OD试题及答案-A027-密室逃生游戏

题目描述

小强正在参加《密室逃生》游戏,当前关卡要求找到符合给定 密码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
说明第 2 个箱子中的 Abc ,符合密码 abc。
输入abc
s,sdf134 A2c4bd 523[]
输出-1
说明第2个箱子中的Abcd,与密码不完全匹配,不符合要求

题目解析

问题描述

小强正在参加一个“密室逃生”游戏,他需要找到一个符合给定密钥 KKK(升序的不重复小写字母组成)的箱子,并返回箱子编号。每个箱子中都有一个字符串 SSS,字符串由大小写字母、数字、标点符号、空格组成。需要在这些字符串中找到所有的字母,并忽略大小写后排列成升序,与密钥 KKK 进行匹配。满足条件的箱子不会超过一个。

输入描述

  1. 第一行为密钥 keykeykey 的字符串。
  2. 第二行为箱子序列 boxesboxesboxes,为数组形式,以空格分隔。
    • 箱子 NNN 数量满足 1≤N≤100001 \leq N \leq 100001≤N≤10000
    • KKK 度满足 0≤S.length≤500 \leq S.length \leq 500≤S.length≤50
    • 密钥为仅包含小写字母的升序字符,且不存在重复字母
    • 密钥 KKK 长度 1≤K.length≤261 \leq K.length \leq 261≤K.length≤26

输出描述

返回对应箱子编号,如果不存在符合要求的密钥,则返回 -1。

示例

输入:

abc
s,sdf134 A2c4b

输出:

2

解释:第2个箱子的 A2c4b 符合密钥 abc

解题思路

  1. 提取字母:从每个箱子字符串中提取所有字母,忽略大小写后排序。
  2. 匹配密钥:将提取的字母排序后与密钥进行匹配。
  3. 返回结果:找到匹配的箱子编号,如果没有找到,返回 -1。

C++代码实现

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <cctype>

using namespace std;

// 提取并排序字符串中的字母
string extractAndSortLetters(const string& s) {
    string letters;
    for (char c : s) {
        if (isalpha(c)) {
            letters += tolower(c);
        }
    }
    sort(letters.begin(), letters.end());
    return letters;
}

int main() {
    string key;
    getline(cin, key);

    vector<string> boxes;
    string box;
    while (getline(cin, box, ' ')) {
        boxes.push_back(box);
    }

    string sortedKey = extractAndSortLetters(key);
    
    for (int i = 0; i < boxes.size(); ++i) {
        string sortedBoxLetters = extractAndSortLetters(boxes[i]);
        if (sortedBoxLetters == sortedKey) {
            cout << i + 1 << endl;
            return 0;
        }
    }

    cout << -1 << endl;
    return 0;
}

代码说明

  1. extractAndSortLetters函数:提取字符串中的字母,转换为小写并排序。
  2. 主函数:读取输入的密钥和箱子序列,对每个箱子字符串提取字母并排序后与密钥进行比较,找到匹配的箱子编号并输出,如果没有匹配的,输出 -1。

这个程序能够找到符合密钥要求的箱子,并返回箱子编号。

python代码实现

def extract_and_sort_letters(s):
    letters = [c.lower() for c in s if c.isalpha()]
    return ''.join(sorted(letters))

def find_matching_box(key, boxes):
    sorted_key = extract_and_sort_letters(key)
    
    for i, box in enumerate(boxes):
        sorted_box_letters = extract_and_sort_letters(box)
        if sorted_box_letters == sorted_key:
            return i + 1
    
    return -1

# 读取输入
key = input().strip()
boxes = input().strip().split()

# 计算并输出结果
print(find_matching_box(key, boxes))

代码说明

  1. extract_and_sort_letters函数:提取字符串中的字母,转换为小写并排序。
  2. find_matching_box函数:对每个箱子字符串提取字母并排序后与密钥进行比较,找到匹配的箱子编号并返回,如果没有匹配的,返回 -1。
  3. 读取输入:通过input().strip()读取密钥和箱子序列。
  4. 计算并输出结果:调用find_matching_box函数计算匹配的箱子编号,并输出结果。

这个Python程序能够找到符合密钥要求的箱子,并返回箱子编号。你可以在Python环境中运行这个程序来实现该功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值