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 <stdio.h>
#include <string.h>
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("YES\n");
            continue;
        }
        printf("NO\n");
    }
    return 0;
}

(一行可以不加大括号)

 

4.结语

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

小白别忘了去盲打一遍 bye

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值