链接
https://pintia.cn/problem-sets/994805260223102976/problems/1071785884776722432
题面
给定两个字符串 A 和 B,本题要求你输出 A+B,即两个字符串的并集。要求先输出 A,再输出 B,但重复的字符必须被剔除。
输入格式
输入在两行中分别给出 A 和 B,均为长度不超过 10^6的、由可见 ASCII 字符 (即码值为32~126)和空格组成的、由回车标识结束的非空字符串。
输出格式
在一行中输出题面要求的 A 和 B 的和。
输入样例
This is a sample test
to show you_How it works
输出样例
This ampletowyu_Hrk
题目分析
本体的核心是:“重复的字符必须被剔除”。这是语文理解,也就是说按照字符出现的顺序。如果字符重复出现,则剔除,如果字符第一次出现,则保留。
如果能理解重复字符必须剔除,那么这题就很简单了。至于题目中提到的字符串长度不会超过10^6,这个其实是没有任何用处的。当然这个和你的编程方法有关系。
这题可以很简单的每次读入一个字符,而不是一次性将字符串读入再逐个分析。那么这个题目的核心问题就编程如何判断字符重复出现,简单的方法就是标记。从题目中可以知道所有ASCII字符都是可见字符,范围从32 ~ 126,因此只需要简单的利用数组来统计即可。
样例代码
题解代码
#include <cstdio>
int main() {
int num[127] = {};//统计次数
char ch;
while ((ch=getchar())!=EOF) {
if (ch<32 || ch>126) {
continue;
}
if (num[ch]==0) {
printf("%c", ch);
}
num[ch]++;
}
return 0;
}
测试数据生成代码
#include <cstdio>
#include <cstdlib>
#include <ctime>
//最大生成1e6个字符
int main(int argc, char *argv[]) {
int seed = time(NULL);
if (argc>1) {
//有参数
seed = atoi(argv[1]);
}
srand(seed);
//生成数量
int n;
int lo;
int hi;
//生成字符串A
int i, j;
char data;
for (i=0; i<2; i++) {
lo = 1;
hi = 1e6;
n = lo + rand()%(hi-lo+1);
lo = 32;
hi = 126;
for (j=0; j<n; j++) {
data = (char)(lo + rand()%(hi-lo+1));
printf("%c", data);
}
printf("\n");
}
return 0;
}
Windows下对拍参考
@echo off
:loop
gen.exe %random% > data.in
std.exe < data.in >std.out
pta1093.exe < data.in > my.out
fc my.out std.out
if not errorlevel 1 goto loop
pause
goto loop
注:由于本题过于简单,可以不需要对拍。
广告
有兴趣可以关注我在GitHub上的题解。
GitHub的项目地址
https://github.com/justidle2012/PATSolution/
本题链接
https://github.com/justidle2012/PATSolution/blob/master/Basic%20Level/1093/pta1093.cpp