栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

PAT乙级1003 我要通过 C语言 最好理解的解法30行轻松拿下

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

PAT乙级1003 我要通过 C语言 最好理解的解法30行轻松拿下

目录

1.说在前面

2.看题目

我们来逐句分解一下:

思路整理:

3.看代码

4.结语


1.说在前面

拿到一个编程题,如果一时间没有很好的解题思路,可以去尝试把题目分解。

例如哪个地方需要一个读入哪个地方需要一个输出以及如何实现等,在我们手写的过程中就会认清这个题目要考我们的是什么。

我建议最好是去动手写一写题目的需求,这样不仅可以帮助我们理清解题思路还可以锻炼我们的编程思维,慢慢从手写→心写。

2.看题目

说实话这道1003最恼人的就是题目,理解题意比解题难很多。

我们来逐句分解一下:

1.字符串中必须仅有 P、 A、 T这三种字符,不可以包含其它字符;

解:顾名思义,存在且只能存在 P、A、T 三种字符!出现其他直接NO!!!

2.任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串; 

解:如果x是空字符串就是最基本的 P A T,就算两侧有东西也只能是A,

       不可以是PP PAT PP,所以我们可以间接的理解为A可以多个,P和T只能有一个。

 3.如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a、 b、 c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

解:题目说 aPbTc ,别急我们代入一下A,aPbTc == APATA 

       再看 aPbATca ,abc为空字符串那就是原型,代入A之后,aPbATc == APAATAA 。

       为了更加直观我们引入几个可以获得YES的输入样例:

       PAAT、AAPATAA、AAPAATAAAA

       稍加观察我们可以发现,位于左中右的A呈:左A * 中A == 右A 的情况。

思路整理:

有且仅有 P、A、T 三个字母。

P和T各一个。

左A * 中A == 右A 。

读懂题意,理清思路后这道题约等于over了(代码仅供参考,看完自己盲写一下)

注释已经添加好方便大家理解,30行代码绝对够用~~

3.看代码

 

#include 
#include 
int main(void) {
    char str[101];
    int i,j,count;
    int numa1 = 0, numa2 = 0, numa3 = 0, nump = 0, numt = 0;        //a1,a2,a3为左中右A的数量

    scanf("%d", &count);            //读入输入的整数

    for (j = 0; j < count; j++, numa1 = 0, numa2 = 0, numa3 = 0, nump = 0, numt = 0) {      //循环读入字符串并初始化计数
        scanf("%s", str);
        for (i = 0; i < strlen(str); i++) {      //遍历数组计算P、A、T的个数
            if (str[i] == 'A' && nump == 0)
                numa1++;
            else if (str[i] == 'P' && numt == 0)     //记录P的存在以及保证其在T前面
                nump++;
            else if (str[i] == 'A' && nump != 0 && numt == 0)
                numa2++;
            else if (str[i] == 'T' && numa2 != 0)       //记录T的存在并保证中间A的存在
                numt++;
            else if (str[i] == 'A' && nump != 0 && numt != 0)
                numa3++;
            else
                break;
        }

        if (nump == 1 && numt == 1 && numa2 > 0 && numa1 * numa2 == numa3) {        //输出条件
            printf("YESn");
            continue;
        }
        printf("NOn");
    }
    return 0;
}

(一行可以不加大括号)

 

4.结语

此题难在理解题意,其他并没什么特殊之处,我第一次看到这道题的时候恶心好久因为自己根本不想读(其实有点读不懂),可是别人都能顺利通过自己就一定能,希望大家在日常刷题的过程中不要被纸老虎吓到。

小白别忘了去盲打一遍 bye

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1011247.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号