【华为OD-E卷 - 猜字谜100分(python、java、c++、js、c)】

【华为OD-E卷 - 猜字谜100分(python、java、c++、js、c)】

题目

小王设计了一个简单的猜字谜游戏,游戏的谜面是一个错误的单词,比如nesw,玩家需要猜出谜底库中正确的单词。猜中的要求如下: 对于某个谜面和谜底单词,满足下面任一条件都表示猜中:
变换顺序以后一样的,比如通过变换w和e的顺序,"nwes"跟"news"是可以完全对应的; 字母去重以后是一样的,比如"woood"和"wood"是一样的,它们去重后都是"wod" 请你写一个程序帮忙在谜底库中找到正确的谜底。谜面是多个单词,都需要找到对应的谜底,如果找不到的话,返回"not found"

输入描述

  • 谜面单词列表,以","分隔 谜底库单词列表,以","分隔

输出描述

  • 匹配到的正确单词列表,以","分隔 如果找不到,返回"not found" 备注 单词的数量N的范围:0 < N < 1000 词汇表的数量M的范围:0 < M < 1000 单词的长度P的范围:0 < P < 20 输入的字符只有小写英文字母,没有其他字符

用例

用例一:
输入:
复制代码
conection
connection,today
输出:
复制代码
connection
用例二:
输入:
复制代码
bdni,wooood
bind,wrong,wood
输出:
复制代码
bind,wood

python解法

  • 解题思路:
  • 该题目要求根据输入的 issues 和 answers 两组字符串,找出每个 issue 是否在 answers 中能够找到匹配的答案。如果找到匹配的答案,返回该答案;如果找不到完全匹配的答案,则尝试通过排序后的字符匹配(忽略重复字符)来找到可能的匹配。如果两者都找不到匹配,则返回 "not found"。

解题步骤:

输入处理:

issues 和 answers 都是由逗号分隔的字符串组成,转换成列表格式以便后续处理。

解决匹配问题:

对每个 issue,首先通过 set 去重并排序,生成一个唯一的字符集表示。

如果这个唯一字符集在 answers 中存在,则返回相应的答案。

如果找不到完全匹配的答案,则对 issue 和每个 answer 进行排序,并尝试查找匹配的答案。

如果两种匹配方式都未能找到答案,则返回 "not found"。

结果输出:

所有的结果通过逗号 , 连接成字符串,输出最终的答案。

python 复制代码
def getResult2(issues, answers):
    result = []  # 用来存储每个issue的匹配结果

    # 遍历每个问题(issue)
    for issue in issues:
        unique_issue = ''.join(sorted(set(issue)))  # 通过排序和去重生成唯一的字符表示
        found = False  # 标记是否找到了匹配的答案

        # 首先通过唯一字符匹配来查找
        for answer in answers:
            unique_answer = ''.join(sorted(set(answer)))  # 对每个答案进行相同的处理

            # 如果找到了完全匹配的答案,则添加到结果列表并跳出循环
            if unique_issue == unique_answer:
                result.append(answer)
                found = True
                break  # 结束当前问题的匹配查找

        # 如果未找到完全匹配,则对排序后的字符串进行比较
        if not found:
            sorted_issue = ''.join(sorted(issue))  # 对当前问题字符串排序
            for answer in answers:
                sorted_answer = ''.join(sorted(answer))  # 对每个答案字符串排序
                if sorted_issue == sorted_answer:
                    result.append(answer)
                    found = True
                    break  # 结束当前问题的匹配查找

        # 如果仍未找到匹配的答案,返回"not found"
        if not found:
            result.append("not found")

    # 返回结果,多个结果用逗号连接成一个字符串
    return ",".join(result)

# 输入:问题和答案的字符串,按逗号分隔
issues = input().split(",")  # 获取问题列表
answers = input().split(",")  # 获取答案列表

# 调用函数并输出结果
print(getResult2(issues, answers))

java解法

  • 解题思路
  • 本题的任务是根据给定的 puzzleWords(谜题词)和 dictionaryWords(字典词),对每个谜题词寻找与其匹配的字典词。如果一个字典词和谜题词有相同的字符(忽略字符顺序和重复),则认为这个字典词与谜题词匹配。对于每个谜题词,若找到匹配的字典词,则输出该字典词;如果找不到匹配的字典词,则输出 "not found"。

解题步骤:

输入处理:

先读取谜题词 puzzleWords 和字典词 dictionaryWords。

将它们分别拆分为字符串数组,进行后续处理。

匹配规则:

对于每个谜题词,创建一个字符集合 puzzleSet,这个集合包含该词的唯一字符。

然后遍历字典中的每个词,检查该词的字符集合是否与当前谜题词的字符集合相同。

如果匹配,直接返回该字典词。如果遍历完字典词没有找到匹配,则返回 "not found"。

字符集合的使用:

使用 Set 来存储字符,因为集合自动去重,并且无序,使得我们可以忽略字符的顺序和重复。

输出结果:

如果找到匹配的字典词,将其添加到结果列表 matchedWords 中。

如果找不到匹配,添加 "not found"。

最终将所有结果通过逗号连接成字符串并返回。

java 复制代码
import java.util.*;

public class Main {
    public static void main(String[] args) {
        // 创建Scanner对象以读取输入
        Scanner scanner = new Scanner(System.in);

        // 读取谜题词和字典词,并用逗号分割成数组
        String[] puzzleWords = scanner.nextLine().split(",");
        String[] dictionaryWords = scanner.nextLine().split(",");

        // 调用matchWordsBySet方法,输出结果
        System.out.println(matchWordsBySet(puzzleWords, dictionaryWords));
    }

    // 用于根据字符集合匹配谜题词与字典词的函数
    public static String matchWordsBySet(String[] puzzleWords, String[] dictionaryWords) {
        List<String> matchedWords = new ArrayList<>(); // 存储匹配的字典词

        // 遍历每个谜题词
        for (String puzzle : puzzleWords) {
            boolean isMatched = false;  // 标记是否找到匹配的字典词
            Set<Character> puzzleSet = getUniqueChars(puzzle);  // 获取谜题词的字符集合

            // 遍历字典中的每个词
            for (String word : dictionaryWords) {
                // 如果谜题词的字符集合和字典词的字符集合相同
                if (puzzleSet.equals(getUniqueChars(word))) {
                    matchedWords.add(word);  // 将匹配的字典词添加到结果列表
                    isMatched = true;  // 设置匹配标志
                    break;  // 找到匹配的字典词后,跳出字典词遍历
                }
            }

            // 如果没有找到匹配的字典词,添加 "not found"
            if (!isMatched) {
                matchedWords.add("not found");
            }
        }

        // 将匹配结果列表转换为以逗号分隔的字符串并返回
        return String.join(",", matchedWords);
    }

    // 获取字符串中唯一字符的集合
    public static Set<Character> getUniqueChars(String word) {
        Set<Character> charSet = new HashSet<>();  // 使用HashSet来存储字符,自动去重
        for (char c : word.toCharArray()) {
            charSet.add(c);  // 将每个字符添加到集合中
        }
        return charSet;  // 返回字符集合
    }
}

C++解法

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

C解法

解题思路

c 复制代码
更新中

JS解法

解题思路

javascript 复制代码
更新中

注意:

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

相关推荐
板鸭〈小号〉1 分钟前
命名管道实现本地通信
开发语言·c++
FG.15 分钟前
Day13
java·面试
站大爷IP19 分钟前
用Python打造办公效率神器:从数据到文档的全流程自动化实践
python
渔舟唱晚@25 分钟前
Axios 取消请求的演进:CancelToken vs. AbortController
javascript
GISer_Jing30 分钟前
XHR / Fetch / Axios 请求的取消请求与请求重试
前端·javascript·网络
天涯学馆34 分钟前
微前端架构设计:从理论到实践的全面指南
前端·javascript·面试
hongjianMa36 分钟前
ModuleNotFoundError No module named ‘torch_geometric‘未找到
python
火兮明兮1 小时前
Python训练第四十五天
开发语言·python
zdy12635746881 小时前
python43天
python·深度学习·机器学习
梦想CAD控件1 小时前
(VUE3集成CAD)在线CAD实现焊接符号自定义
前端·javascript·vue.js