首页 > 编程语言 >【华为OD-E卷 - 猜字谜100分(python、java、c++、js、c)】

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

时间:2024-12-27 18:00:42浏览次数:13  
标签:字符 匹配 题词 python OD found java issue 字典

【华为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”。
结果输出:

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

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”。
最终将所有结果通过逗号连接成字符串并返回。

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++解法

  • 解题思路
更新中

C解法

  • 解题思路

更新中

JS解法

  • 解题思路

更新中

注意:

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

标签:字符,匹配,题词,python,OD,found,java,issue,字典
From: https://blog.csdn.net/CodeClimb/article/details/144773177

相关文章

  • Java多线程处理文件详解与代码示例
    在Java编程中,文件处理是一项常见的任务。当需要处理大量文件或处理文件的时间较长时,单线程的处理方式可能会显得效率低下。为了提高文件处理的效率,我们可以使用多线程技术。本文将详细介绍如何使用Java多线程来处理文件,并提供一个详细的代码示例,该示例可以直接运行。一、多线......
  • 郴州年夜饭大数据分析:Python爬虫的美味之旅
    在春节这个阖家团圆的日子里,年夜饭无疑是最具仪式感的一餐。郴州,这座美食之城,其年夜饭的餐桌上自然少不了那些让人垂涎三尺的地道美食。作为一名热爱美食的程序员,我决定用Python爬虫技术,为大家揭秘郴州年夜饭的必备菜品。以下是我如何通过Python爬虫获取郴州年夜饭菜品信息,......
  • 【K8s】专题十五(6):Kubernetes 网络之 Pod 网络调试
    本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发、订阅专栏!专栏订阅入口| 精选文章 | Kubernetes |Docker|Linux |羊毛资源 | 工具推荐 |往期精彩文章【Docker】(全网首发)KylinV10下MySQL容器内存占用异常的解决......
  • 祝大家这周圣诞快乐!!本周进军多模态!From LLMs to MLLMs:Exploring the Landscape of Mu
    从LLMs到MLLMs:探索多模态越狱攻击的前景禁止盗用,侵权必究!!!欢迎大家积极举报......
  • Python数据结构之队列
    1、对列队列(Queue)是一种线性数据结构,遵循先进先出(FIFO)的原则。可以将队列想象成排队的场景,最先排队的人最先被服务。2、队列的特点先进先出(FIFO):队列遵循先进先出的原则,第一个进入队列的元素最先被移除。两个操作端:队列在队尾插入元素,在队首移除元素,两个操作端分别负责不同......
  • Kafka Broker、Producer、Consumer配置参数
    参数的设置对Kafka性能有着至关重要的影响。以下是一些关键参数及其对性能的具体影响:KafkaBroker配置参数num.network.threads:控制Kafka网络线程的数量,这些线程负责处理网络I/O操作。增加此参数的值可以提高网络I/O处理能力,但也会增加内存消耗。num.io.threads:控制KafkaI/O......
  • python怎么读取配置文件
    configparser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节点(section),每个节可以有多个参数(键=值)。使用的配置文件的好处就是不用把程序写死,可以使程序更灵活。1、创建配置文件一般将配置文件创建在config包下,配置文......
  • 3种算法实现Python3数组的旋转
    Python3实现旋转数组的3种算法下面是Python3实现的旋转数组的3种算法。一、题目给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。例如:输入:[1,2,3,4,5,6,7]和k=3输出:[5,6,7,1,2,3,4]解释:向右旋转1步:[7,1,2,3,4,5,6]向右旋转2步:[6,7,1......
  • JavaScript开发中常见问题代码和相关优化Demo参考4.0
    31. 忽略错误处理的幂等性问题代码:functionupdateUser(id,updates){//更新用户信息}解决方案:确保API端点和函数调用是幂等的,即多次调用不会导致不同的结果。asyncfunctionupdateUser(id,updates){try{awaitfetch(`/api/users/${id}`,{meth......
  • java 多线程处理list集合数据的实例应用
    众所周知创建线程的三种方式:继承Thread,重写run方法实现Runnable接口,重新run方法实现Callable接口,重写call方法下面使用Callable,来说一下为什么使用1.Thread类和Runnable接口都不允许声明检查型异常,也不能定义返回值。没有返回值这点稍微有点麻烦。不能声明抛出检查型异常则......