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 <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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的老周

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值