这个题我做的时候也查了不少资料,看了很多前辈实现的代码。前辈们真的很牛,用了很少的代码就实现了这个题目要求,但我理解起来困难太大。
我的想法也是用字符数组存储输入的值,但是采用遍历寻找每个字母出现次数的方法。
题目的条件前两个很好懂,就不过多赘述了,第三个条件其实要拿第二个条件作为基础条件,然后进行变化,最后得到的条件应该是前A的数目*中A的数目=后A的数目。
因为成不成立的条件都与各个字母出现的次数有关系,自然而然想到我可以把所有字母出现的次数算一遍,其中A要分为前A,中A和后A。乍一想好像很难实现,其实不然,只要遍历到P的时候退出,那么下一次再遍历的A就是中A的数目。这就要求我们记载每次遍历后退出的值是多少,由于本身是一个输出该字母出现次数的函数,因此要想再得到一个值,这里应该用引用或者是指针的方法。由于对指针不熟悉,这里踩了很多坑,包括但不仅限于:
一开始写的是*p++,这其实是对p的地址加1,那么p就指向别的地方去了,所以应该是(*p)++才正确
这段代码虽然长,但是思路比较简单,个人认为比较适合初学者看懂吧,如果有不理解的地方欢迎讨论
#include<stdio.h>
#include<windows.h>
int findA1(char a[],int *);
int findP(char a[],int *);
int findA2(char a[],int *);
int findT(char a[],int *);
int findA3(char a[],int *);
int main(){
int n;
int begin = 0;//这个是作为每次寻找的起始值,由于对函数内容不熟悉,一开始以为只能用指针传递,其实可以直接传形参,但这里还是保留原始答案
int numA1 = 0,numA2 = 0,numA3 = 0;
int numP = 0,numT =0;
char pat[101];
int i;
for(i=0;i<101;i++){
pat[i] = '0';
}
i =