技巧总结
- 熟练掌握字符串的使用技巧 :使用getline之前要用getchar读取上一行的回车,字符串可以 一行一行的存储到数组
- 学会unordered_map,快速使用哈希
解题思路
题目的意思就是给你模板和变量名和变量值,将模板中变量名的地方用变量值替换输出,若无变量值输出空格
解题过程首先将所有模板一行一行的读入并存入数组
将变量名 和变量值 以key - value的形式存入map中
然后遍历模板中每一行内容
如果出现{{ 则表明出现了变量名,将变量名读取,然后通过读取的变量名在map中找出相应的变量值进行输出
否则照常输出模板内容
代码实现1
#include <iostream>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <vector>
using namespace std;
vector <string> s;
unordered_map <string, string> kv;
void workv(string str, string &key, string &value)
{
int j = 0;
while (j < str.size() && str[j] != ' ') j ++; //当j为' ',结束循环
key = str.substr(0, j);//截取key
value = str.substr(j + 2, str.size() - j - 3); //截取value
return ;
}
void work(string str, int &i)
{
int j = i + 3; //i指向{,i + 3指向“{{ ”后面一位
string t; //存储key
for (; str[j] != ' '; j ++) t += str[j];
i = j + 2;
//题目中没有卡不合法命名变量的情况
cout << kv[t]; //若没有存储,则输出为空
return ;
}
int main()
{
int m, n;
cin >> m >> n;
getchar();
string str;
//读入m行模板
for (int i = 0; i < m; i ++)
{
getline(cin, str);
s.push_back(str);
}
//读入并处理n行键值对
for (int i = 0; i < n; i ++)
{
getline(cin, str);
string key = "";
string value = "";
workv(str, key, value); //提取键值对
//cout << key << " " << value << endl;
kv[key] = value; //保存键值对
}
//处理输出每一行
for (auto x : s)
{
if (x.find("{{ ") == -1) cout << x << endl; //如果不存在可以直接输出整行
else
{
for (int i = 0; i < x.size(); i ++)
{
//这里的ifelse不要写反,如果写反了,会出现当前这个字符是{,但不满足"{{ ",则会少输出一个{
if (x[i] == '{' && i + 2 < x.size() && x[i + 1] == '{' && x[i + 2] == ' ')
{
work(x, i); //当满足"{{ ",就处理,输出value,并将i指向" }}"最后一个}
}
else cout << x[i]; //如果不满足直接输出这个字符
}
cout << endl;
}
}
return 0;
}
代码实现2
#include <iostream>
#include <cstring>
#include <algorithm
>
#include <unordered_map> //key唯一的 key - value 容器
#include <vector>
using namespace std;
vector <string> strs; //存储模板
unordered_map <string, string> vars; //存储变量
int main()
{
int n, m;
cin >> n >> m;
getchar(); //读取第一行的回车,因为下面要使用getline
while (n --)
{
string str;
getline(cin, str); //读取一行字符串
strs.push_back(str); //存入strs
}
while (m --)
{
string key, value;
cin >> key; //读取变量名
char c;
while (c = getchar(), c != '\"'); //读取到第一个引号结束读取
while (c = getchar(), c != '\"') value += c; //读取到下一个引号结束读取,在string末尾添加字符
vars[key] = value; //将key - value 存入vars
}
for (auto& str: strs) //遍历模板
{
for (int i = 0; i < str.size();)
{
if (i < str.size() - 1 && str[i] == '{' && str[i + 1] == '{') //如果出现 {{,则表明后面是变量名
{
int j = i + 3; //j指向变量名的第一个字母
string key;
while (str[j] != ' ' || str[j + 1] != '}' || str[j + 2] != '}') //当 出现空格}}表示变量名内容读取完
{
key += str[j ++];
}
cout << vars[key]; //根据key在vars中找出value,若没有则输出null
i = j + 3; //将i指向}后的字符
}
else cout << str[i ++]; //如果后面不是变量名,就正常输出
}
cout << endl;
}
return 0;
}