PAT题解——Basic Level——1093字符串A+B

链接

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 

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 

#include 

#include 

 

//最大生成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

            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

你可能感兴趣的:(#,PAT题解,OJ题解)