机考E卷100分题 - 猜字谜

题目描述

小王设计了一个简单的猜字谜游戏,游戏的谜面是一个错误的单词,比如nesw,玩家需要猜出谜底库中正确的单词。猜中的要求如下:
对于某个谜面和谜底单词,满足下面任一条件都表示猜中:

  1. 变换顺序以后一样的,比如通过变换w和e的顺序,“nwes”跟“news”是可以完全对应的;
  2. 字母去重以后是一样的,比如“woood”和“wood”是一样的,它们去重后都是“wod”

请你写一个程序帮忙在谜底库中找到正确的谜底。谜面是多个单词,都需要找到对应的谜底,如果找不到的话,返回”not found”

输入描述

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

输出描述

  • 匹配到的正确单词列表,以","分隔
  • 如果找不到,返回"not found"

备注

  • 单词的数量N的范围:0 < N < 1000
  • 词汇表的数量M的范围:0 < M < 1000
  • 单词的长度P的范围:0 < P < 20
  • 输入的字符只有小写英文字母,没有其他字符

示例1

输入

conection
connection,today
12

输出

connection
1

示例2

输入

bdni,wooood
bind,wrong,wood
12

输出

bind,wood
1

解题思路

猜中的情况:

  1. 变换顺序以后一样的,比如通过变换w和e的顺序,“nwes”跟“news”是可以完全对应的;
  2. 字母去重以后是一样的,比如“woood”和“wood”是一样的,它们去重后都是“wod”
  3. 以上两个同时满足

直接对谜底和谜面单词进行去重+字典序排序,然后对比即可

两个字符串变为数组后进行排序,如果排序后的数组一致,则表示变序后一致。

去重后是否一致:将两个字符串去重后加入列表中,如果两个列表一致,则表示去重后一致。

Java

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 读取谜面单词列表,以逗号分隔
        String[] puzzleWords = scanner.nextLine().split(",");
        // 读取谜底库单词列表,以逗号分隔
        String[] answerBank = scanner.nextLine().split(",");
        // 创建一个列表,用于存储匹配到的正确单词
        List<String> matchedAnswers = new ArrayList<>();

        // 遍历谜面单词列表
        for (String puzzleWord : puzzleWords) {
            // 去除谜面单词中的重复字母,TreeSet自动升序排序
            String puzzleWordNoDuplicate = String.join("", new TreeSet<>(Arrays.asList(puzzleWord.split(""))));
            // 标记是否匹配到对应的谜底
            boolean isFound = false;

            // 遍历谜底库单词列表
            for (String answer : answerBank) {
                // 去除谜底单词中的重复字母,TreeSet自动升序排序
                String answerNoDuplicate = String.join("", new TreeSet<>(Arrays.asList(answer.split(""))));

                // 如果去重后的谜面单词与谜底单词相同,则将谜底单词添加到结果列表中,并将 isFound 标记为 true
                if (puzzleWordNoDuplicate.equals(answerNoDuplicate)) {
                    matchedAnswers.add(answer);
                    isFound = true;
                }
            }

            // 如果没有找到匹配的单词,则将 "not found" 添加到结果列表中
            if (!isFound) {
                matchedAnswers.add("not found");
            }
        }

        // 输出匹配到的正确单词列表,以逗号分隔
        System.out.println(String.join(",", matchedAnswers));
    }
}



1234567891011121314151617181920212223242526272829303132333435363738394041424344

Python

puzzle_words = input().split(",")
word_bank = input().split(",")

# 用于存储匹配到的正确单词列表
matched_words = []

# 遍历每个谜面
for puzzle_word in puzzle_words:
    # 将谜面中的字符去重并排序
    sorted_puzzle_word = "".join(sorted(set(puzzle_word)))
    # 标记是否找到匹配的谜底
    found = False

    # 遍历每个谜底
    for word in word_bank:
        # 将谜底中的字符去重并排序
        sorted_word = "".join(sorted(set(word)))

        # 判断谜底是否与谜面匹配
        if sorted_puzzle_word == sorted_word:
            # 将匹配到的谜底添加到结果列表中
            matched_words.append(word)
            # 标记为已找到匹配的谜底
            found = True

    # 如果没有找到匹配的谜底,将"not found"添加到结果列表中
    if not found:
        matched_words.append("not found")

# 输出匹配到的正确单词列表,以","分隔
print(",".join(matched_words))


123456789101112131415161718192021222324252627282930313233

JavaScript

// 导入 readline 模块,用于从标准输入读取数据
const readline = require('readline');

// 创建 readline 接口实例,用于处理输入输出
const rl = readline.createInterface({
  input: process.stdin, // 指定标准输入流
  output: process.stdout // 指定标准输出流
});

// 监听第一个输入行,即谜面单词列表
rl.on('line', (puzzleInput) => {
  // 监听第二个输入行,即谜底库单词列表
  rl.on('line', (answerBankInput) => {
    // 将谜面单词列表按照逗号分隔成数组
    const puzzles = puzzleInput.split(',');
    // 将谜底库单词列表按照逗号分隔成数组
    const answerBank = answerBankInput.split(',');
    // 用于存储匹配到的正确单词
    const matchedAnswers = [];

    // 遍历每一个谜面单词
    for (let puzzleIndex = 0; puzzleIndex < puzzles.length; puzzleIndex++) {
      // 对谜面单词进行排序并去重
      const sortedPuzzle = puzzles[puzzleIndex].split('') // 将单词分割成字符数组
        .sort() // 对字符数组进行排序
        .filter((char, index, array) => {
          // 通过过滤函数去重,保留第一次出现的字符
          return index === 0 || char !== array[index - 1];
        })
        .join(''); // 将处理后的字符数组重新组合成字符串

      let found = false; // 用于标记当前谜面是否找到匹配的正确单词

      // 遍历谜底库中的每一个单词
      for (let answerIndex = 0; answerIndex < answerBank.length; answerIndex++) {
        // 对谜底单词进行排序并去重,方法同上
        const sortedAnswer = answerBank[answerIndex].split('')
          .sort()
          .filter((char, index, array) => {
            return index === 0 || char !== array[index - 1];
          })
          .join('');

        // 如果处理后的谜面单词和谜底单词相同,则表示匹配成功
        if (sortedPuzzle === sortedAnswer) {
          // 将匹配到的谜底单词加入结果数组
          matchedAnswers.push(answerBank[answerIndex]);
          found = true; // 标记为已找到匹配
          break; // 一旦找到匹配的正确单词,跳出当前循环
        }
      }

      // 如果没有找到匹配的正确单词,加入"not found"标记
      if (!found) {
        matchedAnswers.push("not found");
      }
    }

    // 将匹配到的正确单词以逗号分隔的形式输出
    console.log(matchedAnswers.join(', '));
    rl.close(); // 关闭 readline 接口
  });
});

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364

C++

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

using namespace std;

int main() {
    string input_puzzles, input_solutions;
    
 
    getline(cin, input_puzzles); // 读取第一行谜面单词列表
    getline(cin, input_solutions); // 读取第二行谜底单词列表

    vector<string> puzzles, solutions;
    string temp = "";
    
    // 将输入的谜面单词列表以“,”分隔并存储在puzzles向量中
    for (char c : input_puzzles) {
        if (c == ',') {
            puzzles.push_back(temp); // 遇到逗号,将temp中的单词加入puzzles
            temp = ""; // 重置temp
        } else {
            temp += c; // 将字符加入temp
        }
    }
    puzzles.push_back(temp); // 将最后一个单词加入puzzles

    temp = "";
    // 将输入的谜底库单词列表以“,”分隔并存储在solutions向量中
    for (char c : input_solutions) {
        if (c == ',') {
            solutions.push_back(temp); // 遇到逗号,将temp中的单词加入solutions
            temp = ""; // 重置temp
        } else {
            temp += c; // 将字符加入temp
        }
    }
    solutions.push_back(temp); // 将最后一个单词加入solutions

    vector<string> matched_solutions; // 用于存储匹配到的谜底单词
    // 遍历每个谜面单词
    for (string puzzle : puzzles) {
        string sorted_puzzle = puzzle;
        sort(sorted_puzzle.begin(), sorted_puzzle.end()); // 对谜面单词排序
        sorted_puzzle.erase(unique(sorted_puzzle.begin(), sorted_puzzle.end()), sorted_puzzle.end()); // 去重

        bool found = false; // 标记是否找到匹配的谜底单词

        // 遍历谜底库中的每个单词
        for (string solution : solutions) {
            string sorted_solution = solution;
            sort(sorted_solution.begin(), sorted_solution.end()); // 对谜底单词排序
            sorted_solution.erase(unique(sorted_solution.begin(), sorted_solution.end()), sorted_solution.end()); // 去重

            if (sorted_puzzle == sorted_solution) { // 如果排序去重后的结果相同
                matched_solutions.push_back(solution); // 将该谜底单词加入匹配结果中
                found = true; // 标记为找到匹配
                break; // 跳出当前循环
            }
        }

        if (!found) { // 如果未找到匹配的谜底单词
            matched_solutions.push_back("not found"); // 加入"not found"
        }
    }

    // 输出第一个匹配结果
    cout << matched_solutions[0];
    // 输出剩余的匹配结果,中间以逗号分隔
    for (int i = 1; i < matched_solutions.size(); i++) {
        cout << "," << matched_solutions[i];
    }

    return 0; // 程序结束
}

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677

C语言

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// 自定义比较函数,用于qsort中的字符排序
int compare(const void *a, const void *b) {
    return *(char *)a - *(char *)b;
}

// 去重函数,将字符串中的重复字符移除
void remove_duplicates(char *str) {
    int length = strlen(str);
    if (length < 2) return;

    int j = 0;
    for (int i = 1; i < length; i++) {
        if (str[i] != str[j]) {
            j++;
            str[j] = str[i];
        }
    }
    str[j + 1] = '\0';
}

int main() {
    char input_puzzles[1000], input_solutions[1000];

    // 从标准输入读取谜面和谜底列表
    fgets(input_puzzles, sizeof(input_puzzles), stdin); // 读取第一行谜面单词列表
    fgets(input_solutions, sizeof(input_solutions), stdin); // 读取第二行谜底单词列表

    // 移除字符串末尾的换行符
    input_puzzles[strcspn(input_puzzles, "\n")] = '\0';
    input_solutions[strcspn(input_solutions, "\n")] = '\0';

    char *puzzles[1000];
    char *solutions[1000];
    int puzzle_count = 0, solution_count = 0;

    // 将谜面单词列表以“,”分隔并存储在puzzles数组中
    char *token = strtok(input_puzzles, ",");
    while (token != NULL) {
        puzzles[puzzle_count++] = strdup(token); // 将分隔出的单词复制到puzzles中
        token = strtok(NULL, ",");
    }

    // 将谜底库单词列表以“,”分隔并存储在solutions数组中
    token = strtok(input_solutions, ",");
    while (token != NULL) {
        solutions[solution_count++] = strdup(token); // 将分隔出的单词复制到solutions中
        token = strtok(NULL, ",");
    }

    char *matched_solutions[1000];
    int match_count = 0;

    // 遍历每个谜面单词
    for (int i = 0; i < puzzle_count; i++) {
        char sorted_puzzle[1000];
        strcpy(sorted_puzzle, puzzles[i]);
        qsort(sorted_puzzle, strlen(sorted_puzzle), sizeof(char), compare); // 对谜面单词排序
        remove_duplicates(sorted_puzzle); // 去重

        int found = 0; // 标记是否找到匹配的谜底单词

        // 遍历谜底库中的每个单词
        for (int j = 0; j < solution_count; j++) {
            char sorted_solution[1000];
            strcpy(sorted_solution, solutions[j]);
            qsort(sorted_solution, strlen(sorted_solution), sizeof(char), compare); // 对谜底单词排序
            remove_duplicates(sorted_solution); // 去重

            if (strcmp(sorted_puzzle, sorted_solution) == 0) { // 如果排序去重后的结果相同
                matched_solutions[match_count++] = solutions[j]; // 将该谜底单词加入匹配结果中
                found = 1; // 标记为找到匹配
                break; // 跳出当前循环
            }
        }

        if (!found) { // 如果未找到匹配的谜底单词
            matched_solutions[match_count++] = "not found"; // 加入"not found"
        }
    }

    // 输出第一个匹配结果
    printf("%s", matched_solutions[0]);
    // 输出剩余的匹配结果,中间以逗号分隔
    for (int i = 1; i < match_count; i++) {
        printf(",%s", matched_solutions[i]);
    }

    // 释放动态分配的内存
    for (int i = 0; i < puzzle_count; i++) {
        free(puzzles[i]);
    }
    for (int i = 0; i < solution_count; i++) {
        free(solutions[i]);
    }

    return 0;  
}

#华为##OD##牛客创作赏金赛#

主要记录自己的刷题日常,学而时习之。

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-07 13:47
机械打工仔:你自己匿名可以,这么好的公司就别给它匿名了
点赞 评论 收藏
分享
避坑恶心到我了大家好,今天我想跟大家聊聊我在成都千子成智能科技有限公司(以下简称千子成)的求职经历,希望能给大家一些参考。千子成的母公司是“同创主悦”,主要经营各种产品,比如菜刀、POS机、电话卡等等。听起来是不是有点像地推销售公司?没错,就是那种类型的公司。我当时刚毕业,急需一份临时工作,所以在BOSS上看到了千子成的招聘信息。他们承诺无责底薪5000元,还包住宿,这吸引了我。面试的时候,HR也说了同样的话,感觉挺靠谱的。于是,我满怀期待地等待结果。结果出来后,我通过了面试,第二天就收到了试岗通知。试岗的内容就是地推销售,公司划定一个区域,然后你就得见人就问,问店铺、问路人,一直问到他们有意向为止。如果他们有兴趣,你就得摇同事帮忙推动,促进成交。说说一天的工作安排吧。工作时间是从早上8:30到晚上18:30。早上7点有人叫你起床,收拾后去公司,然后唱歌跳舞(销售公司都这样),7:55早课(类似宣誓),8:05同事间联系销售话术,8:15分享销售技巧,8:30经理训话。9:20左右从公司下市场,公交、地铁、自行车自费。到了市场大概10点左右,开始地推工作。中午吃饭时间大约是12:00,公司附近的路边盖饭面馆店自费AA,吃饭时间大约40分钟左右。吃完饭后继续地推工作,没有所谓的固定中午午休时间。下午6点下班后返回公司,不能直接下班,需要与同事交流话术,经理讲话洗脑。正常情况下9点下班。整个上班的一天中,早上到公司就是站着的,到晚上下班前都是站着。每天步数2万步以上。公司员工没有自己的工位,百来号人挤在一个20平方米的空间里听经理洗脑。白天就在市场上奔波,公司的投入成本几乎只有租金和工资,没有中央空调。早上2小时,晚上加班2小时,纯蒸桑拿。没有任何福利,节假日也没有3倍工资之类的。偶尔会有冲的酸梅汤和西瓜什么的。公司的晋升路径也很有意思:新人—组长—领队—主管—副经理—经理。要求是业绩和团队人数,类似传销模式,把人留下来。新人不能加微信、不能吐槽公司、不能有负面情绪、不能谈恋爱、不能说累。在公司没有任何坐的地方,不能依墙而坐。早上吃早饭在公司外面的安全通道,未到上班时间还会让你吃快些不能磨蹭。总之就是想榨干你。复试的时候,带你的师傅会给你营造一个钱多事少离家近的工作氛围,吹嘘工资有多高、还能吹自己毕业于好大学。然后让你早点来公司、无偿加班、抓住你可能不会走的心思进一步压榨你。总之,大家在找工作的时候一定要擦亮眼睛,避免踩坑!———来自网友
qq乃乃好喝到咩噗茶:不要做没有专业门槛的工作
点赞 评论 收藏
分享
05-16 11:16
已编辑
东华理工大学 Java
牛客73769814...:盲猜几十人小公司,庙小妖风大,咋不叫她去4️⃣呢😁
牛客创作赏金赛
点赞 评论 收藏
分享
小叮当411:应该是1-3个月吧
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务