开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情
[传智杯 #5 练习赛] 复读
题目描述
给定若干个字符串,不定数量,每行一个。有些字符串可能出现了多次。如果读入一个字符串后,发现这个字符串以前被读入过,则这个字符串被称为前面相同的字符串的复读,这个字符串被称为复读字符串。相应的,每个首次出现的字符串就是非复读字符串。
举个例子,
abc
def
abc
abc
abc
第 行是字符串 abc,那么 行的字符串会被称为“复读”。
请你把所有的非复读字符串,按照行号从小到大的顺序,依次拼接为一个长串并输出。
输入格式
多个字符串,每行一个,含义见题目描述。
注意:如果这个字符串是 0,说明所有字符串都读完了。这个 0 不认为是一个“非复读字符串”。
输出格式
共一行,表示所有非复读字符串,按照行号从小到大依次连接的结果。
样例 #1
样例输入 #1
cc
b
a
cc
0
样例输出 #1
ccba
提示
【数据范围】
字符串的个数不超过 个,字符串总长度不超过 ,每个字符串中只包含小写字母、数字、 . 、! 和 &,不包含空格等特殊符号。
思路分析
- 1.首先对于这道题我们毫无疑问的使用哈希表是比较方便的
- 2.但是要注意的一点是,哈希表(unordered_map)的排序有一个默认值,也就是说,直接这样存储,输出的顺序会出现问题
- 3.由此,我们需要另外的一个动态数组(vector)来记录存储字符串
- 4.最后再用vector数组来输出答案
代码展示
#include<iostream>
#include<unordered_map>
#include<vector>
using namespace std;
int main()
{
unordered_map<string, int>mp;
vector<string>v;
while (true) {
string s;
cin >> s;
if (s[0] == '0')break;
if (mp.count(s) == 0) {
mp[s] = 1;
v.push_back(s);
}
}
for (int i = 0; i < v.size(); i++)cout << v[i];
return 0;
}
PS:这是练习赛的第一题,但是任然用到了STL容器,所以初学者真的难拿到省奖,还需要再次磨炼~