(A卷,100分)- 猜字谜(Java & JS & Python)

题目描述

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

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

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

输入描述

  1. 谜面单词列表,以“,”分隔
  2. 谜底库单词列表,以","分隔

输出描述

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

备注

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

用例

输入 conection
connection,today
输出 connection
说明
输入 bdni,wooood
bind,wrong,wood
输出 bind,wood
说明

题目解析

本题有点歧义,那就是:

对于某个谜面和谜底单词,满足下面任一条件都表示猜中:

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

那么如果两个条件都满足的话,算不算猜中呢?

如果两个条件都满足也算猜中的话,那我们直接对谜底和谜面单词进行去重+字典序排序,然后对比即可。

如果两个条件都满足不算猜中,只有一个条件满足才算猜中的话,则需要对单词分别进行去重和字典序排序,然后对比两次。

这里我给出两个情况的实现。

2023.02.21 根据机考网友反馈,本题使用“两个条件都满足”的解法可以获得100%通过率

JavaScript算法源码

两个条件都满足也算猜中

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const lines = [];
rl.on("line", (line) => {
  lines.push(line);

  if (lines.length === 2) {
    const issues = lines[0].split(",");
    const answers = lines[1].split(",");
    console.log(getResult(issues, answers));
    lines.length = 0;
  }
});

function getResult(issues, answers) {
  const ans = [];

  for (let issue of issues) {
    const str1 = [...new Set(issue)].sort().join("");
    let find = false;

    for (let answer of answers) {
      const str2 = [...new Set(answer)].sort().join("");
      if (str1 === str2) {
        ans.push(answer);
        find = true;
        // break; // 如果一个谜面对应多个谜底,这里就不能break,如果一个谜面只对应一个谜底,那这里就要break,考试的时候都试下
      }
    }

    if (!find) {
      ans.push("not found");
    }
  }

  return ans.join(",");
}

唯一条件满足才算猜中

/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

const lines = [];
rl.on("line", (line) => {
  lines.push(line);

  if (lines.length === 2) {
    const issues = lines[0].split(",");
    const answers = lines[1].split(",");
    console.log(getResult(issues, answers));
    lines.length = 0;
  }
});

function getResult(issues, answers) {
  const ans = [];

  for (let issue of issues) {
    const sorted_issue = [...issue].sort().join(""); // 排序后字符串
    const distinct_issue = [...new Set(issue)].join(""); // 去重后字符串
    let find = false;

    for (let answer of answers) {
      const sorted_answer = [...answer].sort().join(""); // 排序后字符串
      const distinct_answer = [...new Set(answer)].join(""); // 去重后字符串

      if (
        sorted_issue === sorted_answer ||
        distinct_issue === distinct_answer
      ) {
        ans.push(answer);
        find = true;
        // break; // 如果一个谜面对应多个谜底,这里就不能break,如果一个谜面只对应一个谜底,那这里就要break,考试的时候都试下
      }
    }

    if (!find) {
      ans.push("not found");
    }
  }

  return ans.join(",");
}

Java算法源码

两个条件都满足也算猜中

import java.util.ArrayList;
import java.util.Scanner;
import java.util.StringJoiner;
import java.util.TreeSet;

public class Main {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    String[] issues = sc.nextLine().split(",");
    String[] answers = sc.nextLine().split(",");

    System.out.println(getResult(issues, answers));
  }

  public static String getResult(String[] issues, String[] answers) {
    ArrayList<String> ans = new ArrayList<>();

    for (String issue : issues) {
      String str1 = getSortedAndDistinctStr(issue);
      boolean find = false;

      for (String answer : answers) {
        String str2 = getSortedAndDistinctStr(answer);
        if (str1.equals(str2)) {
          ans.add(answer);
          find = true;
          // break; // 如果一个谜面对应多个谜底,这里就不能break,如果一个谜面只对应一个谜底,那这里就要break,考试的时候都试下
        }
      }

      if (!find) {
        ans.add("not found");
      }
    }

    StringJoiner sj = new StringJoiner(",", "", "");
    for (String an : ans) {
      sj.add(an);
    }
    return sj.toString();
  }

  public static String getSortedAndDistinctStr(String str) {
    TreeSet<Character> set = new TreeSet<>();
    for (char c : str.toCharArray()) set.add(c);
    return set.toString();
  }
}

唯一条件满足才算猜中

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        String[] issues = sc.nextLine().split(",");
        String[] answers = sc.nextLine().split(",");

        System.out.println(getResult(issues, answers));
    }

    public static String getResult(String[] issues, String[] answers) {
        ArrayList<String> ans = new ArrayList<>();

        for (String issue : issues) {
            String[] issueDeal = getSortedAndDistinctStr(issue);
            boolean find = false;

            for (String answer : answers) {
                String[] answerDeal = getSortedAndDistinctStr(answer);

                if(issueDeal[0].equals(answerDeal[0]) || issueDeal[1].equals(answerDeal[1])) {
                    ans.add(answer);
                    find = true;
                    // break; // 如果一个谜面对应多个谜底,这里就不能break,如果一个谜面只对应一个谜底,那这里就要break,考试的时候都试下
                }
            }

            if(!find) {
                ans.add("not found");
            }
        }

        StringJoiner sj = new StringJoiner(",","","");
        for (String an : ans) {
            sj.add(an);
        }
        return sj.toString();
    }

    public static String[] getSortedAndDistinctStr(String str) {
        char[] arr = str.toCharArray();
        Arrays.sort(arr);
        String sorted_str = new String(arr); // 字典序排序后的字符串

        LinkedHashSet<Character> set = new LinkedHashSet<>();
        for (char c : str.toCharArray()) set.add(c);
        String distinct_str = set.toString(); // 去重后的字符串

        return new String[]{sorted_str, distinct_str};
    }
}

Python算法源码

两个条件都满足也算猜中

# 输入获取
issues = input().split(",")
answers = input().split(",")


# 算法入口
def getResult(issues, answers):
    ans = []

    for issue in issues:
        str1 = "".join(sorted(set(issue)))
        find = False

        for answer in answers:
            str2 = "".join(sorted(set(answer)))

            if str1 == str2:
                ans.append(answer)
                find = True
                # break # 如果一个谜面对应多个谜底,这里就不能break,如果一个谜面只对应一个谜底,那这里就要break,考试的时候都试下

        if not find:
            ans.append("not found")

    return ",".join(ans)


# 算法调用
print(getResult(issues, answers))

唯一条件满足才算猜中

# 输入获取
issues = input().split(",")
answers = input().split(",")


# 算法入口
def getResult(issues, answers):
    ans = []

    for issue in issues:
        sorted_issue = "".join(sorted(issue))
        distinct_issue = "".join(set(issue))
        find = False

        for answer in answers:
            sorted_answer = "".join(sorted(answer))
            distinct_answer = "".join(set(answer))

            if sorted_issue == sorted_answer or distinct_issue == distinct_answer:
                ans.append(answer)
                find = True
                # break # 如果一个谜面对应多个谜底,这里就不能break,如果一个谜面只对应一个谜底,那这里就要break,考试的时候都试下

        if not find:
            ans.append("not found")

    return ",".join(ans)


# 算法调用
print(getResult(issues, answers))

免责声明:

1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文

0

评论0

站点公告

没有账号?注册  忘记密码?