【2024年华为OD机试】(A卷,100分)- 猜字谜(Java JS PythonC/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
说明
谜面 conection 与谜底库中 connection 是匹配的。
输入
bdni,wooood
bind,wrong,wood
输出
bind,wood
说明
谜面 bdni 经过变换顺序后匹配 bind,wooood 去重后匹配 wood。
输入
abc
def,ghi
输出
not found
根据题目描述,谜面和谜底单词满足以下任一条件即表示猜中:
- 变换顺序后相同:例如,通过变换字母顺序,“nwes”与“news”可以完全对应。
- 字母去重后相同:例如,“woood”和“wood”去重后都是“wod”,因此它们被认为是相同的。
如果谜面和谜底单词同时满足这两个条件,根据题目的逻辑,仍然算作猜中。因此,我们可以采用以下方法来判断是否猜中:
- 去重:将谜面和谜底单词中的重复字母去掉。
- 排序:将去重后的字母按字典序排序。
- 对比:如果排序后的结果相同,则说明谜面和谜底单词满足条件,猜中。
思路具体步骤:
- 对谜面单词和谜底单词分别进行去重操作。
- 对去重后的字母进行字典序排序。
- 比较排序后的结果,如果相同,则猜中。
示例:
- 谜面单词:
nwes - 谜底单词:
news
- 去重:
nwes去重后为nwes(无重复字母)。news去重后为news(无重复字母)。
- 排序:
nwes排序后为ensw。news排序后为ensw。
- 对比:
- 排序后的结果相同,因此猜中。
总结:
如果谜面和谜底单词在去重并排序后结果相同,则算作猜中。这种方法可以同时处理变换顺序
二、JavaScript算法源码
以下是两段代码的中文详细注释和逻辑讲解:
代码 1:两个条件都满足才算猜中
代码逻辑
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)); // 调用 getResult 函数计算结果并输出lines.length = 0; // 清空 lines 数组,准备接收下一组输入}
});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"); // 如果没有找到匹配的谜底,加入 "not found"}}return ans.join(","); // 将结果数组用逗号连接成字符串并返回
}
代码讲解
-
输入处理:
- 使用
readline模块读取输入。 - 第一行是谜面数组
issues,第二行是谜底数组answers。 - 当输入两行后,调用
getResult函数计算结果并输出。
- 使用
-
去重和排序:
- 对每个谜面
issue和谜底answer进行去重和排序,生成字符串str1和str2。 - 去重使用
new Set(),排序使用sort()。
- 对每个谜面
-
匹配逻辑:
- 如果
str1和str2相同,说明谜面和谜底去重排序后的字符相同,匹配成功。 - 将匹配的谜底加入结果数组
ans。
- 如果
-
未匹配处理:
- 如果遍历完所有谜底仍未找到匹配的,将
"not found"加入结果数组。
- 如果遍历完所有谜底仍未找到匹配的,将
-
输出结果:
- 将结果数组
ans用逗号连接成字符串并返回。
- 将结果数组
代码 2:唯一条件满足才算猜中
代码逻辑
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)); // 调用 getResult 函数计算结果并输出lines.length = 0; // 清空 lines 数组,准备接收下一组输入}
});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"); // 如果没有找到匹配的谜底,加入 "not found"}}return ans.join(","); // 将结果数组用逗号连接成字符串并返回
}
代码讲解
-
输入处理:
- 使用
readline模块读取输入。 - 第一行是谜面数组
issues,第二行是谜底数组answers。 - 当输入两行后,调用
getResult函数计算结果并输出。
- 使用
-
排序和去重:
- 对每个谜面
issue和谜底answer分别进行排序和去重,生成两个字符串:sorted_issue和sorted_answer:排序后的字符串。distinct_issue和distinct_answer:去重后的字符串。
- 对每个谜面
-
匹配逻辑:
- 如果
sorted_issue === sorted_answer或distinct_issue === distinct_answer,说明谜面和谜底满足其中一个条件,匹配成功。 - 将匹配的谜底加入结果数组
ans。
- 如果
-
未匹配处理:
- 如果遍历完所有谜底仍未找到匹配的,将
"not found"加入结果数组。
- 如果遍历完所有谜底仍未找到匹配的,将
-
输出结果:
- 将结果数组
ans用逗号连接成字符串并返回。
- 将结果数组
两段代码的区别
-
匹配条件:
- 代码 1:要求谜面和谜底去重排序后的字符串完全相同。
- 代码 2:要求谜面和谜底排序后的字符串相同 或 去重后的字符串相同。
-
适用场景:
- 代码 1:适用于严格匹配场景,谜面和谜底必须完全一致(去重排序后)。
- 代码 2:适用于宽松匹配场景,谜面和谜底只需满足其中一个条件即可。
示例解析
输入
abc,bac,aa
cba,aab,xyz
代码 1 运行结果
cba,aab,not found
- 解析:
abc和cba去重排序后均为abc,匹配成功。bac和aab去重排序后分别为abc和ab,不匹配。aa和xyz去重排序后分别为a和xyz,不匹配。
代码 2 运行结果
cba,aab,not found
- 解析:
abc和cba排序后均为abc,匹配成功。bac和aab排序后分别为abc和aab,不匹配。aa和xyz去重后分别为a和xyz,不匹配。
总结
- 代码 1 和代码 2 的核心逻辑相似,主要区别在于匹配条件的严格程度。
- 代码 1 要求谜面和谜底去重排序后完全相同,代码 2 只需满足排序或去重中的一个条件即可。
- 根据实际需求选择合适的匹配条件。
如果有其他问题,欢迎随时提问!
三、Java算法源码
以下是两段 Java 代码的中文详细注释和逻辑讲解:
代码 1:两个条件都满足才算猜中
代码逻辑
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)); // 调用 getResult 函数计算结果并输出}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"); // 如果没有找到匹配的谜底,加入 "not found"}}StringJoiner sj = new StringJoiner(",", "", ""); // 使用 StringJoiner 拼接结果for (String an : ans) {sj.add(an);}return sj.toString(); // 返回拼接后的字符串}public static String getSortedAndDistinctStr(String str) {TreeSet<Character> set = new TreeSet<>(); // 使用 TreeSet 去重并排序for (char c : str.toCharArray()) set.add(c);return set.toString(); // 返回去重排序后的字符串}
}
代码讲解
-
输入处理:
- 使用
Scanner读取输入。 - 第一行是谜面数组
issues,第二行是谜底数组answers。 - 调用
getResult函数计算结果并输出。
- 使用
-
去重和排序:
- 对每个谜面
issue和谜底answer进行去重和排序,生成字符串str1和str2。 - 使用
TreeSet实现去重和排序。
- 对每个谜面
-
匹配逻辑:
- 如果
str1和str2相同,说明谜面和谜底去重排序后的字符相同,匹配成功。 - 将匹配的谜底加入结果数组
ans。
- 如果
-
未匹配处理:
- 如果遍历完所有谜底仍未找到匹配的,将
"not found"加入结果数组。
- 如果遍历完所有谜底仍未找到匹配的,将
-
输出结果:
- 使用
StringJoiner将结果数组ans用逗号连接成字符串并返回。
- 使用
代码 2:唯一条件满足才算猜中
代码逻辑
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)); // 调用 getResult 函数计算结果并输出}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"); // 如果没有找到匹配的谜底,加入 "not found"}}StringJoiner sj = new StringJoiner(",","",""); // 使用 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<>(); // 使用 LinkedHashSet 去重for (char c : str.toCharArray()) set.add(c);String distinct_str = set.toString(); // 生成去重后的字符串return new String[]{sorted_str, distinct_str}; // 返回排序后和去重后的字符串数组}
}
代码讲解
-
输入处理:
- 使用
Scanner读取输入。 - 第一行是谜面数组
issues,第二行是谜底数组answers。 - 调用
getResult函数计算结果并输出。
- 使用
-
排序和去重:
- 对每个谜面
issue和谜底answer分别进行排序和去重,生成两个字符串:sorted_str:排序后的字符串。distinct_str:去重后的字符串。
- 对每个谜面
-
匹配逻辑:
- 如果
sorted_str相同 或distinct_str相同,说明谜面和谜底满足其中一个条件,匹配成功。 - 将匹配的谜底加入结果数组
ans。
- 如果
-
未匹配处理:
- 如果遍历完所有谜底仍未找到匹配的,将
"not found"加入结果数组。
- 如果遍历完所有谜底仍未找到匹配的,将
-
输出结果:
- 使用
StringJoiner将结果数组ans用逗号连接成字符串并返回。
- 使用
两段代码的区别
-
匹配条件:
- 代码 1:要求谜面和谜底去重排序后的字符串完全相同。
- 代码 2:要求谜面和谜底排序后的字符串相同 或 去重后的字符串相同。
-
适用场景:
- 代码 1:适用于严格匹配场景,谜面和谜底必须完全一致(去重排序后)。
- 代码 2:适用于宽松匹配场景,谜面和谜底只需满足其中一个条件即可。
示例解析
输入
abc,bac,aa
cba,aab,xyz
代码 1 运行结果
cba,not found,not found
- 解析:
abc和cba去重排序后均为[a, b, c],匹配成功。bac和aab去重排序后分别为[a, b, c]和[a, b],不匹配。aa和xyz去重排序后分别为[a]和[x, y, z],不匹配。
代码 2 运行结果
cba,aab,not found
- 解析:
abc和cba排序后均为abc,匹配成功。bac和aab去重后分别为bac和ab,不匹配。aa和xyz去重后分别为a和xyz,不匹配。
总结
- 代码 1 和代码 2 的核心逻辑相似,主要区别在于匹配条件的严格程度。
- 代码 1 要求谜面和谜底去重排序后完全相同,代码 2 只需满足排序或去重中的一个条件即可。
- 根据实际需求选择合适的匹配条件。
如果有其他问题,欢迎随时提问!
四、Python算法源码
以下是两段 Python 代码的中文详细注释和逻辑讲解:
代码 1:两个条件都满足才算猜中
代码逻辑
# 输入获取
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") # 如果没有找到匹配的谜底,加入 "not found"return ",".join(ans) # 将结果数组用逗号连接成字符串并返回# 算法调用
print(getResult(issues, answers))
代码讲解
-
输入处理:
- 使用
input()读取输入。 - 第一行是谜面数组
issues,第二行是谜底数组answers。
- 使用
-
去重和排序:
- 对每个谜面
issue和谜底answer进行去重和排序,生成字符串str1和str2。 - 使用
set()去重,sorted()排序,"".join()将字符列表拼接成字符串。
- 对每个谜面
-
匹配逻辑:
- 如果
str1和str2相同,说明谜面和谜底去重排序后的字符相同,匹配成功。 - 将匹配的谜底加入结果数组
ans。
- 如果
-
未匹配处理:
- 如果遍历完所有谜底仍未找到匹配的,将
"not found"加入结果数组。
- 如果遍历完所有谜底仍未找到匹配的,将
-
输出结果:
- 使用
",".join(ans)将结果数组ans用逗号连接成字符串并返回。
- 使用
代码 2:唯一条件满足才算猜中
代码逻辑
# 输入获取
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") # 如果没有找到匹配的谜底,加入 "not found"return ",".join(ans) # 将结果数组用逗号连接成字符串并返回# 算法调用
print(getResult(issues, answers))
代码讲解
-
输入处理:
- 使用
input()读取输入。 - 第一行是谜面数组
issues,第二行是谜底数组answers。
- 使用
-
排序和去重:
- 对每个谜面
issue和谜底answer分别进行排序和去重,生成两个字符串:sorted_issue和sorted_answer:排序后的字符串。distinct_issue和distinct_answer:去重后的字符串。
- 对每个谜面
-
匹配逻辑:
- 如果
sorted_issue相同 或distinct_issue相同,说明谜面和谜底满足其中一个条件,匹配成功。 - 将匹配的谜底加入结果数组
ans。
- 如果
-
未匹配处理:
- 如果遍历完所有谜底仍未找到匹配的,将
"not found"加入结果数组。
- 如果遍历完所有谜底仍未找到匹配的,将
-
输出结果:
- 使用
",".join(ans)将结果数组ans用逗号连接成字符串并返回。
- 使用
两段代码的区别
-
匹配条件:
- 代码 1:要求谜面和谜底去重排序后的字符串完全相同。
- 代码 2:要求谜面和谜底排序后的字符串相同 或 去重后的字符串相同。
-
适用场景:
- 代码 1:适用于严格匹配场景,谜面和谜底必须完全一致(去重排序后)。
- 代码 2:适用于宽松匹配场景,谜面和谜底只需满足其中一个条件即可。
示例解析
输入
abc,bac,aa
cba,aab,xyz
代码 1 运行结果
cba,not found,not found
- 解析:
abc和cba去重排序后均为abc,匹配成功。bac和aab去重排序后分别为abc和ab,不匹配。aa和xyz去重排序后分别为a和xyz,不匹配。
代码 2 运行结果
cba,aab,not found
- 解析:
abc和cba排序后均为abc,匹配成功。bac和aab去重后分别为bac和ab,不匹配。aa和xyz去重后分别为a和xyz,不匹配。
总结
- 代码 1 和代码 2 的核心逻辑相似,主要区别在于匹配条件的严格程度。
- 代码 1 要求谜面和谜底去重排序后完全相同,代码 2 只需满足排序或去重中的一个条件即可。
- 根据实际需求选择合适的匹配条件。
如果有其他问题,欢迎随时提问!
五、C/C++算法源码:
以下是 C++ 代码的中文详细注释和逻辑讲解:
代码逻辑
#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_set>
#include <sstream>using namespace std;// 函数用于将字符串排序并去重
string sortAndDistinct(const string& s) {string sortedStr = s; // 复制输入字符串sort(sortedStr.begin(), sortedStr.end()); // 对字符串进行排序auto last = unique(sortedStr.begin(), sortedStr.end()); // 去重,返回去重后的结束迭代器sortedStr.erase(last, sortedStr.end()); // 删除重复字符return sortedStr; // 返回排序并去重后的字符串
}// 算法入口
string getResult(const vector<string>& issues, const vector<string>& answers) {vector<string> ans; // 存储每个谜面对应的谜底for (const string& issue : issues) { // 遍历每个谜面string sortedIssue = sortAndDistinct(issue); // 对谜面排序并去重bool find = false; // 标记是否找到匹配的谜底for (const string& answer : answers) { // 遍历每个谜底string sortedAnswer = sortAndDistinct(answer); // 对谜底排序并去重if (sortedIssue == sortedAnswer) { // 如果谜面和谜底排序并去重后的字符串相同ans.push_back(answer); // 将谜底加入结果数组find = true; // 标记为找到// break; // 如果一个谜面对应多个谜底,这里就不能break,如果一个谜面只对应一个谜底,那这里就要break,考试的时候都试下}}if (!find) { // 如果没有找到匹配的谜底ans.push_back("not found"); // 加入 "not found"}}// 将结果拼接成逗号分隔的字符串stringstream result; // 使用 stringstream 拼接结果for (size_t i = 0; i < ans.size(); ++i) {if (i != 0) {result << ","; // 如果不是第一个元素,添加逗号}result << ans[i]; // 添加当前谜底}return result.str(); // 返回拼接后的字符串
}int main() {// 输入获取string issuesInput, answersInput;getline(cin, issuesInput); // 读取谜面输入getline(cin, answersInput); // 读取谜底输入// 将输入字符串分割为vectorvector<string> issues; // 存储谜面数组vector<string> answers; // 存储谜底数组stringstream ssIssues(issuesInput); // 使用 stringstream 解析谜面输入stringstream ssAnswers(answersInput); // 使用 stringstream 解析谜底输入string temp;while (getline(ssIssues, temp, ',')) { // 按逗号分割谜面输入issues.push_back(temp); // 将分割后的谜面加入数组}while (getline(ssAnswers, temp, ',')) { // 按逗号分割谜底输入answers.push_back(temp); // 将分割后的谜底加入数组}// 调用算法并输出结果cout << getResult(issues, answers) << endl; // 调用 getResult 函数并输出结果return 0;
}
代码讲解
-
输入处理:
- 使用
getline(cin, issuesInput)和getline(cin, answersInput)读取谜面和谜底的输入。 - 使用
stringstream将输入字符串按逗号分割,并存储到vector<string>中。
- 使用
-
排序和去重:
sortAndDistinct函数对字符串进行排序和去重:- 使用
sort()对字符串进行排序。 - 使用
unique()去重,并删除重复字符。
- 使用
-
匹配逻辑:
- 遍历每个谜面
issue,调用sortAndDistinct函数生成排序并去重后的字符串sortedIssue。 - 遍历每个谜底
answer,调用sortAndDistinct函数生成排序并去重后的字符串sortedAnswer。 - 如果
sortedIssue和sortedAnswer相同,说明谜面和谜底匹配成功,将谜底加入结果数组ans。
- 遍历每个谜面
-
未匹配处理:
- 如果遍历完所有谜底仍未找到匹配的,将
"not found"加入结果数组。
- 如果遍历完所有谜底仍未找到匹配的,将
-
结果拼接:
- 使用
stringstream将结果数组ans拼接成逗号分隔的字符串。
- 使用
-
输出结果:
- 调用
getResult函数计算结果,并输出拼接后的字符串。
- 调用
示例解析
输入
abc,bac,aa
cba,aab,xyz
运行结果
cba,not found,not found
- 解析:
abc和cba排序并去重后均为abc,匹配成功。bac和aab排序并去重后分别为abc和ab,不匹配。aa和xyz排序并去重后分别为a和xyz,不匹配。
总结
- 该代码通过排序和去重的方式,严格匹配谜面和谜底。
- 核心逻辑是排序和去重后比较字符串是否相同。
- 使用
stringstream方便地拼接结果字符串。
如果有其他问题,欢迎随时提问!
相关文章:
【2024年华为OD机试】(A卷,100分)- 猜字谜(Java JS PythonC/C++)
一、问题描述 小王设计了一个简单的猜字谜游戏,游戏的谜面是一个错误的单词,比如 nesw,玩家需要猜出谜底库中正确的单词。猜中的要求如下: 对于某个谜面和谜底单词,满足下面任一条件都表示猜中: 变换顺序…...
iostat命令详解
iostat 命令是 I/O statistics(输入/输出统计)的缩写,用来报告系统的 CPU 统计信息和块设备及其分区的 IO 统计信息。iostat 是 sysstat 工具集的一个工具,在 Ubuntu 系统中默认是不带 iostat 命令的,需要自行安装: $ sudo apt in…...
Linux:操作系统简介
前言: 在本片文章,小编将带大家理解冯诺依曼体系以及简单理解操作喜欢,并且本篇文章将围绕什么以及为什么两个话题进行展开说明。 冯诺依曼体系: 是什么: 冯诺依曼体系(Von Neumann architectureÿ…...
企业级信息系统开发讲课笔记4.12 Spring Boot默认缓存管理
文章目录 1. Spring Boot默认缓存管理2. Spring的缓存机制2.1 缓存机制概述2.2 缓存接口和缓存管理接口3. 声明式缓存注解3.1 @EnableCaching注解3.2 @Cacheable注解3.2.1 value/cacheNames属性3.2.2 key属性3.2.3 keyGenerator属性3.2.4 cacheManager/cacheResolver属性3.2.5 …...
2025制定一个高级java开发路线:分布式系统、多线程编程、高并发经验
1-熟悉分布式系统的设计和应用,熟悉分布式、缓存、消息、负载均衡等机制和实现者优先。 2-熟悉多线程编程,具备高并发经验优先。 技术学习规划:熟悉分布式系统和高并发技术 以下是针对目标要求的系统性学习规划,分为 阶段目标 和…...
20250110_ PyTorch中的张量操作
文章目录 前言1、torch.cat 函数2、索引、维度扩展和张量的广播3、切片操作3.1、 encoded_first_node3.2、probs 4、长难代码分析4.1、selected4.1.1、multinomial(1)工作原理: 总结 前言 1、torch.cat 函数 torch.cat 函数将两个张量拼接起来,具体地是…...
hadoop-yarn常用命令
一、YARN命令介绍 1. YARN命令简介 YARN提供了一组命令行工具,用于管理和监控YARN应用程序和集群。 2. yarn application命令 (1) yarn application命令的基本语法 yarn application命令的基本语法如下: yarn application [genericOptions] [comma…...
LabVIEW滤波器功能
程序通过LabVIEW生成一个带噪声的正弦波信号,并利用滤波器对其进行信号提取。具体来说,它生成一个正弦波信号,叠加高频噪声后形成带噪信号,再通过低通滤波器滤除噪声,提取原始正弦波信号。整个过程展示了信号生成、噪声…...
【Unity3D日常开发】Unity3D中打开Window文件对话框打开文件(PC版)
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享QQ群:398291828小红书小破站 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 这篇文章继续讲如何使用Unity3D打开Window文…...
ros2笔记-6.2 使用urdf创建机器人模型
本节主要跟着小鱼老师的视频操作,不同的仿真平台有不同的建模语言,但是几乎都支持URDF。 本节使用URDF创建一个机器人模型。 6.2.1 帮机器人创建一个身体 URDF使用XML来描述机器人的结构和传感器、执行器等信息。 在chapt6/chap6_ws/src创建功能包:r…...
【centos】校时服务创建-频率修改
在 NTP 配置中,校时频率通常是由 NTP 协议自动管理的,NTP 会根据网络延迟和时间偏差动态调整校时频率。不过,您可以通过配置文件中的一些参数来影响 NTP 的行为。 如果想要更改 NTP 的校时频率,可以考虑以下几个方面:…...
J.U.C(1)
目录 JUC(一)一:AQS二:reentrantlock原理1:加锁:2:解锁3:可重入锁原理4:可打断原理5:公平锁原理6:条件变量 三:读写锁(ree…...
计算机网络之---静态路由与动态路由
静态路由 静态路由是由网络管理员手动配置并固定的路由方式。路由器通过静态配置的路由条目来转发数据包,而不会自动调整。它不依赖于任何路由协议。 特点: 手动配置:网络管理员需要手动在路由器中配置每条静态路由。不自动更新:…...
Kubernetes1.28 编译 kubeadm修改证书有效期到 100年.并更新k8s集群证书
文章目录 前言一、资源准备1. 下载对应源码2.安装编译工具3.安装并设置golang 二、修改证书有效期1.修改证书有效期2.修改 CA 证书有效期 三、编译kubeadm四、使用新kubeadm方式1.当部署新集群时,使用该kubeadm进行初始化2.替换现有集群kubeadm操作 前言 kubeadm 默认证书为一…...
C++----STL(string)
引言:STL简介 什么是STL STL(standard template libaray-标准模板库): 是 C标准库的重要组成部分(注意:STL只是C标准库里的一部分,cin和cout也是属于C标准库的),不仅是一个可复用的组件库&…...
利用 Java 爬虫从 yiwugo 根据 ID 获取商品详情
在当今数字化时代,数据是商业决策的关键。对于从事国际贸易的商家来说,精准获取商品的详细信息至关重要。yiwugo 是一个知名的国际贸易平台,拥有海量的商品数据。通过 Java 爬虫技术,我们可以高效地从 yiwugo 根据商品 ID 获取详细…...
vue2修改表单只提交被修改的数据的字段传给后端接口
效果: 步骤一、 vue2修改表单提交的时候,只将修改的数据的字段传给后端接口,没有修改得数据不传参给接口。 在 data 对象中添加一个新的属性,用于存储初始表单数据的副本,与当前表单数据进行比较,找出哪些…...
Flink类加载机制详解
1. 总览 在运行Flink应用时,它会加载各种类,另外我们用户代码也会引入依赖,由于他们依赖版本以及加载顺序等不同,就可能会导致冲突,所以很要必要了解Flink是如何加载类的。 根据加载的来源的不同,我们可以将类分为三种: Java Classpath:Java类路径下,这是Java通用的…...
ClickHouse大数据准实时更新
一、问题背景 最近有一个项目需求,需要对日活跃的3万辆车的定位数据进行分析,并支持查询和统计分析结果。每辆车每天产生1条分析结果数据,要求能够查询过去一年内的所有分析结果。因此,每月需要处理约90万条记录,一年大…...
计算机网络之---端口与套接字
总括 端口:是计算机上用于标识网络服务的数字标识符,用于区分不同的服务或应用程序。套接字:是操作系统提供的用于进程间网络通信的编程接口,允许程序通过它来进行数据的发送、接收和连接管理。关系:端口号用于标识服…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
