马上考四级了,不刷刷题怎么能行呢?HELLO,大家好,我是Zac,今天我来给大家分享一道题:小杨的字典 -> here
题目描述
在遥远的星球,有两个国家 A 国和 B 国,他们使用着不同的语言:A 语言和 B 语言。小杨是 B 国的翻译官,他的工作是将 A 语言的文章翻译成 B 语言的文章。
为了顺利完成工作,小杨制作了一本字典,里面记录了 N 个 A 语言单词对应的 B 语言单词,巧合的是,这些单词都 由地球上的 26 个小写英文字母组成。
小杨希望你写一个程序,帮助他根据这本字典翻译一段 A 语言文章。这段文章由标点符号 !()-.[].{}\|;:'",./?<>
和一些 A 语言单词构成,每个单词之间必定由至少一个标点符号分割,你的程序需要把这段话中的所有 A 语言单词替换成它的 B 语言翻译。特别地,如果遇到不在字典中的单词,请使用大写 UNK 来替换它。
例如,小杨的字典中包含 2 个 A 语言单词 abc
和 d
,它们的 B 语言翻译分别为 a
和 def
,那么我们可以把 A 语言文章 abc.d.d.abc.abcd.
翻译成 B 语言文章 a.def.def.a.UNK.
其中,单词 abcd
不在词典内,因此我们需要使用 UNK 来替换它。
输入格式
第一行一个整数 N,表示词典中的条目数。保证 N≤100。
接下来 N 行,每行两个用单个空格隔开的字符串 A, B ,分别表示字典中的一个 A 语言单词以及它对应的 B 语言翻译。保证所有 A 不重复;保证 A 和 B 的长度不超过 10。
最后一行一个字符串 S ,表示需要翻译的 A 语言文章。保证字符串 S 的长度不超过 1000,保证字符串 S 只包含小写字母以及标点符号 !()-.[].{}\|;:'",./?<>
。
输出格式
输出一行,表示翻译后的结果。
输入输出样例
(这里只给两组哈)
输入 #1
2
abc a
d def
abc.d.d.abc.abcd
输出 #1
a.def.def.a.UNK
——————————————————————————————————————————
输入 #2
1
abcdefghij klmnopqrst
!()-[]{}\|;:'",./?<>abcdefghijklmnopqrstuvwxyz
输出 #2
!()-[]{}\|;:'",./?<>UNK
题目分析
为了解决这个问题,我们可以按照以下步骤编写代码:
-
读取输入的字典条目数
n
。 -
创建一个字典(在编程语言中通常称为哈希表或映射)来存储 A 语言单词到 B 语言翻译的映射。
-
读取字典中的每个条目,将 A 语言单词和对应的 B 语言翻译存入字典。
-
读取需要翻译的文章字符串
ar
。 -
遍历文章字符串,使用正则表达式或字符串分割的方法来识别 A 语言单词。
-
对于每个识别出的 A 语言单词,检查它是否在字典中:
-
如果在字典中,用对应的 B 语言翻译替换它。
-
如果不在字典中,用 "UNK" 替换。
-
-
输出翻译后的文章。
AC代码:
话不多说上代码吧:(英文注释希望大家能看懂…… :))
强迫症版:
#include <iostream>
#include <string>
using namespace std;
string a[105]; // the language in A country
string b[105]; // translate into B country's language
int main() {
int n;
cin >> n;
for (int i = 0; i < n; ++i) {
string a1, b1; // language
cin >> a1 >> b1;
a[i] = a1;
b[i] = b1;
}
string ar; // the article
cin >> ar;
string word = ""; // use it to store words in order to translate
for (int i = 0; i < ar.size(); i++) {
if (ar[i] >= 'a' && ar[i] <= 'z') {
word += ar[i];
}
if (((i == ar.size() - 1) && (ar[i] >= 'a' && ar[i] <= 'z')) || !(ar[i] >= 'a' && ar[i] <= 'z')) { // what the ...?
if (word != "") {
bool flag = 0; // use it to decide if a word is in the dictionary
for (int j = 0; j < n; j++) {
if (word == a[j]) {
cout << b[j];
flag = 1; // it is founded
}
}
if (flag == 0) { // if it is not a word in the dictionary, than print "UNK"
cout << "UNK";
}
word = "";
}
}
if (!(ar[i] >= 'a' && ar[i] <= 'z')) { // if it is not a letter in a word, than print it
cout << ar[i];
}
}
return 0; // don't miss it! :)
}
懒人版:
#include<iostream>
#include<string>
using namespace std;
string a[105]; // the language in A country
string b[105]; // translate into B country's language
int main(){
int n;
cin>>n;
for(int i=0;i<n;++i){
string a1,b1; // language
cin>>a1>>b1;
a[i]=a1;
b[i]=b1;
}
string ar;//the article
cin>>ar;
string word="";//use it to store words in order to translate
for(int i=0;i<ar.size();i++){
if(ar[i]>='a'&&ar[i]<='z'){
word+=ar[i];
}
if((i==ar.size()-1&&ar[i]>='a'&&ar[i]<='z')||(!(ar[i]>='a'&&ar[i]<='z'))){ // what the ...?
if(word!=""){
bool flag=0; // use it to decide if a word is in the dictionary
for(int j=0;j<n;j++){
if(word==a[j]){
cout<<b[j];
flag=1; // it is founded
}
}
if(flag==0){ // if it is not a word in the dictionary,than print "UNK"
cout<<"UNK";
}
word="";
}
}
if(!(ar[i]>='a'&&ar[i]<='z')){ // if it is not a letter in a word,than print it
cout<<ar[i];
}
}
return 0; // don't miss it! :)
}
代码分析:
这段C++代码实现了一个简单的翻译程序,用于将一段由特定单词组成的文本从一种语言(A语言)翻译到另一种语言(B语言)。程序的主要步骤如下:
-
初始化和输入字典:
-
首先,程序通过输入整数
n
来确定字典中有多少个单词对。 -
然后,程序循环
n
次,每次循环中读取一个A语言单词和一个对应的B语言翻译,将它们分别存储在数组a
和b
中。
-
-
读取待翻译文本:
-
程序读取一个字符串
ar
,这个字符串包含了需要翻译的文本。
-
-
翻译过程:
-
程序遍历字符串
ar
的每个字符。 -
如果字符是字母(即在 'a' 到 'z' 范围内),它会被添加到一个临时字符串
word
中,这个字符串用于构建当前正在处理的单词。 -
当遇到非字母字符或到达字符串的末尾时,程序检查
word
是否非空:-
如果
word
非空,程序遍历字典(数组a
和b
),寻找word
是否在字典中:-
如果找到,输出对应的B语言翻译(从数组
b
中获取)。 -
如果没找到,输出 "UNK" 表示单词未在字典中找到。
-
然后清空
word
以准备下一个单词的构建。
-
-
-
如果当前字符是非字母字符,并且
word
非空,程序会先处理word
(如上所述),然后输出当前的非字母字符。
-
-
输出结果:
-
程序最终输出翻译后的文本,其中所有在字典中的单词都被替换为相应的B语言翻译,不在字典中的单词被替换为 "UNK"。
-
这个程序处理了文本中的单词和标点符号,能够根据提供的字典进行翻译,并且能够正确地处理文本末尾的单词。
致谢
感谢kimi小助手帮我进行了懒人版的转换,是它的智能给予我了效率,让我能顺利发表这篇文章。
也感谢所有支持我的人,是你们的鼓励与支持推动我前进,让我有了更多的动力,谢谢!
(END……对了,话说一键三连不过分吧?毕竟我可是写了3426个字呢👍🏼📂✅🙏🏼)