给定两个字符串 A 和 B,本题要求你输出 A+B,即两个字符串的并集。要求先输出 A,再输出 B,但重复的字符必须被剔除。
输入格式:
输入在两行中分别给出 A 和 B,均为长度不超过 106的、由可见 ASCII 字符 (即码值为32~126)和空格组成的、由回车标识结束的非空字符串。
输出格式:
在一行中输出题面要求的 A 和 B 的和。
输入样例:
This is a sample test
to show you_How it works
输出样例:
This ampletowyu_Hrk
代码:
#include <iostream>
#include <cstring>
using namespace std;
int visited[127]={0};
int main()
{
string s1,s2,s;
//使用cin读入字符串的时候,是以空格为分隔符的,如果想要读入一整行的字符串,就需要使用getline
getline(cin, s1);
getline(cin, s2);
s=s1+s2;
for(int i=0;i<s.size();i++)
{
//字符本身是就是一个ASCII码值,可当作整数用
if(visited[s[i]]==0)
cout<<s[i];
visited[s[i]]++;
}
return 0;
}
结果:
分析:
一开始我用的是map,但是测试后发现并集的确出来了,但并不是按顺序出来的。然后我去查找了一下map的特性,然后发现map是按照key排序的而不是按照输入的顺序排序的。无哦一不可以使用map。
错误的代码段:
#include <iostream> #include <cstring> #include <map> using namespace std; int main() { string s1,s2; map<char,int> m; getline(cin, s1); getline(cin, s2); for(int i=0;i<s1.length();i++){ if(m[s1[i]]==0) m[s1[i]]++; } for(int i=0;i<s2.length();i++){ if(m[s1[i]]==0) m[s2[i]]++; } for(auto it = m.begin(); it != m.end(); it++) { cout<<it->first; } return 0; }
结果:
注意:
输入一整行的string类型(带空格的),要使用getline(cin,s);
因为使用cin输入string类型的字符串时,默认按照空格或回车隔开。
还有注意字符本身是就是一个ASCII码值,可当作整数用,故而可以使用hash表解题。
事实上此题并不难,但是需要深入了解C++的某些特性,对于初学C++的我来说是一个很好的积累。