【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万条记录,一年大…...
计算机网络之---端口与套接字
总括 端口:是计算机上用于标识网络服务的数字标识符,用于区分不同的服务或应用程序。套接字:是操作系统提供的用于进程间网络通信的编程接口,允许程序通过它来进行数据的发送、接收和连接管理。关系:端口号用于标识服…...
AX-MES生产制造管理系统-总览
前言说起 MES 就不得不说 ERP,但是 ERP 大家基本上都知道,MES 就不一定了,常见的 ERP 系统包括 SAP、金蝶、用友等,ERP的流程相对来说也比较统一;MES就不同了,基本上熟悉业务流程的软件公司都可以开发并实施…...
硬件答辩问题总结
一、电源纹波是什么,为什么LDO的小,DCDC的大1.电源纹波电源纹波 是指直流电源输出电压上叠加的 交流波动成分,表现为电压在理想直流值附近上下波动。2.LDO 纹波小原理LDO 内部是一个 调整管(可变电阻) 串联在输入和输出…...
CANN-昇腾NPU-RAG推理-检索增强生成怎么部署
RAG(Retrieval-Augmented Generation)是 LLM 知识库的组合:先检索相关文档,再让 LLM 基于文档回答。昇腾NPU 上部署 RAG 需要两个组件:Embedding 模型(做向量检索)和 LLM(做生成&am…...
0.2毫秒快速启动的操作系统
在工业控制以及航空航天等核心场景,极速启动就是高可靠系统的生命线。0.2毫秒超快启动搭配硬件看门狗,让设备在掉电重启、异常恢复时瞬时归位,关键任务永不延误! https://www.bilibili.com/video/BV11mLY6VERt/?spm_id_from333.1…...
别急着扔!12年老ThinkPad X230升级SSD和内存后,Win10流畅得像新电脑
12年老ThinkPad X230重生指南:极简升级打造流畅办公利器每次打开抽屉看到那台积灰的ThinkPad X230,总有种说不出的情感。这款2012年问世的经典商务本,曾陪伴无数人度过加班到凌晨的夜晚。如今性能确实有些力不从心,但直接丢弃又觉…...
AhMyth位置跟踪:GPS定位与地理围栏技术深度解析
AhMyth位置跟踪:GPS定位与地理围栏技术深度解析 【免费下载链接】AhMyth Cross-Platform Android Remote Administration Tool | The only maintained version of AhMyth on github | A revival of the original repository at https://GitHub.com/AhMyth/AhMyth-An…...
HKMG工艺的“阿喀琉斯之踵”:聊聊那个无法移除的SiON界面层与未来0.3nm的挑战
HKMG工艺的隐形枷锁:SiON界面层的物理宿命与亚纳米级突围战 在半导体工艺演进的史诗中,HKMG(高K金属栅)技术曾被寄予厚望——它用金属栅极替代传统多晶硅,搭配高K介质材料HfO₂,一举解决了栅极耗尽和漏电流…...
终极鸣潮优化指南:WaveTools工具箱让你的游戏体验飞起来
终极鸣潮优化指南:WaveTools工具箱让你的游戏体验飞起来 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 对于《鸣潮》玩家来说,流畅的游戏体验和个性化的配置管理是提升游戏乐趣的关…...
《关于 AI Agent 基础设施的一些奇思妙想》
目录 目录 目录 一、AI Agent 容器 问题背景 想法思路:API 中转站模式 多 Agent 切换 二、手机端操控 AI Agent(手机与电脑互联) 三、AI 开发依赖管理工具 总结 最近 AI Agent 越来越火,我作为一个重度使用者,…...
摄影老司机_给照片加边框工具
使用简单, 支持自定义主题 自定义logo 内置四个常用的logo 为什么没有佳能? 因为我没有佳能 外框和内框是什么意思? 外框就是纯色边框 内框,就是将你上传的照片复制一张,放大,作为外框 外框宽度可以自定义 摄影师署名自定义 相机型号有时候识别出来又臭又长,说的就是尼康,所以…...
