PAT1003 JAVA编写
题目理解
首先关于题目的了解,第一眼,想当然的理解,后来发现不行,想了一会没想出来,于是查了各种大佬看法,最后普遍的一种看法是:统计P前的A数量a1,P后T前的A的数量a2,T后的A的数量a3,其中要满足:a2!=0,a1*a2=a3 ;
关于代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();//输入n个字符串
sc.nextLine();
while(n-- !=0) {
String s = sc.nextLine();
int alnum = 0;//P前A的数量
int amnum = 0;//P和T之间A的数量
int arnum = 0;//T之后A的数量
int hasp = 0;//判断P是否是开头
int ans = -1;//判断字符串整体是否符合要求
int pnum = 0;//统计P的数量,避免多出现P
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);//用charAt捕获字符串中每一个字符
if(c=='P'||c=='A'||c=='T') {//题目要求字符串中仅由P,A,T这三种字符,满足才能下一步判断,否则字符串判断NO
if(c=='P') {
hasp = 1;//判断P是否为开头(这一步感觉很nice
pnum = pnum+1;
}//判断P是否开头的同时,统计P的数量
if(c=='A') {
if(hasp==1) amnum++;//在P开头的情况下再遇到的A,即为中间的A,统计
else alnum++;//不是P开头的情况遇到A,即P前A,统计
}
if(c=='T') {
for (int j = i+1; j < s.length(); j++) {//判断T之后的字母是否均为A,是统计,不是字符串判断NO
if(s.charAt(j)=='A') arnum++;//统计T后A
else {
ans = 0;
break;//直接跳出循环
}
}
if(amnum==0) {//判断中间A的数量是否为0,
ans=0;
break;
}
if(ans==-1) {
if(pnum==1){
int mul = amnum * alnum;
if(arnum==mul) {//判断 前A 乘 中间A 是否等于 后A,成立则字符串判断为YES
ans = 1;
}
}else{
ans=0;
break;
}
}
break;
}
}else {
ans=0;
break;
}
}
if(ans==1)
System.out.println("YES");
else
System.out.println("NO");
}
}
}
参考
能力有限,代码主要参考以下,略做调整和注释。
经PAT测试无误。
总结反思
难点1:对题目要求的理解,主要还是要看题目给的测试用例,其中APAAATAA这个判断是NO,需要多观察。
难点2:模式判断,有些写了正则表达式,然后字符串s匹配(s.matches()),用这个又要控制A数量,又要匹配,对于我大概了解匹配规则的我来说,很难。
难点3:统计A的数量,乍一看很难,其实这里可以选择字符串s的split的方法(s.split(“p|T”)),但是又可能出现多P,或者多T的情况,所以参考的老哥这部分做的很赞,一点点判断,charAt()遍历遇到P做标记,再标志之后的A即P后T前的A,累计其数量,遇到第一个T,直接判断后续字符是否均为A,并求和。最后相比较原文,这里进一步考虑PPAT这种情况,这种明显应输出NO,所以还需要考虑P的数量,这里略作修改。