您的位置:首页 > 编程语言 > Java开发

浙江大学PAT (Basic Level) Practice (中文)1003我要通过!JAVA代码实现及其规律分析

2019-03-02 00:04 489 查看

1003

我要通过!

这道题和1001,1002比起来难度其实并没有什么差别,我个人认为这道题主要是在于读懂题目的要求:
1、题目要求字符串中只能含有‘P’,‘A’,‘T’三种字符。
2、xPATx形式的字符串是正确的字符串,这条规则要求:
①‘P’和‘T’之间至少要有1个‘A’字符的存在
②类似PAT,APATA,AAPATAA,AAAPATAAA等等这些首尾‘A’数量相等的字符串是正确的
3、如果 aPbTc 是正确的,那么 aPbATca 也是正确的。
这句话稍微有些难理解,但是我们不妨按照上面第二条规则的要求推理一下:
①首先PAT是正确的,那么PAAT,PAAAT等等,这些也就都是正确的了
②APATA是正确的,那么APAATAA就是正确的
③AAPATAA是正确的,那么AAPAATAAAA就是正确的
④接下来用上面三点推出来的结果当做前提来看
APAATAA是正确的,那么APAAATAAA是正确的
AAPAATAAAA是正确的,那么AAPAAATAAAAAA是正确的

到了这里基本上的规律就可以总结出来了:
设X是P之前A的数量,Y是P和T中间A的数量,Z是T之后的A的数量
那么这三者满足以下关系式:
X*Y=Z
特别地,当Y=0时,字符串不满足要求即为不正确字符串
且P和T都有且只有一个,多了不行,少了不行,并且P要在T之前出现
到了现在,相信大家也就都理解了这道题了
不过其实这道题我觉得使用正则表达式是比较简单的解法,但是相信大多数和我一样刚接触编程没多久的萌新都对正则表达式没有什么了解,所以我接下来的代码实现用的是比较繁琐的多重if判断情况,虽然代码量较多,但是应该比较浅显易懂。

话不多说,接下来就直接贴代码了:

import java.util.Scanner;

class pat
{
public char a[]=new char[101];
pat(String s)
{
a=s.toCharArray();
}

}

public class Main {

public static void main (String[]args)
{
pat P[]=new pat[101];
int n;
String temp;
Scanner input=new Scanner(System.in);
n=input.nextInt();
for(int i=0;i<n;i++)
{
temp=input.next();
P[i]=new pat(temp);
}
for(int i=0;i<n;i++)
{
System.out.println(checkOut(P[i]));
}
}

public static String checkOut(pat p)
{
int pNumber=0;
int tNumber=0;
int sA=0;//位于P之前的A的数量
int mA=0;//位于中间的A的数量
int fA=0;//位于T之后的A的数量
for(char item: p.a)
{

if((item!='P')&&(item!='A')&&(item!='T'))
{
return "NO";
}
if(item=='P')
{
pNumber++;
if(pNumber>=2)
{
return "NO";
}
if((tNumber>0)&&(pNumber==0))
{
return "NO";
}
}
if(item=='T')
{
tNumber++;
if(tNumber>=2)
{
return "NO";
}
}
if(item=='A')
{
if(pNumber==0)
{
sA++;
}
if((pNumber==1)&&(tNumber==0))
{
mA++;
}
if((pNumber==1)&&(tNumber==1))
{
fA++;
}
}
}

if((sA*mA)==fA)
{
if((pNumber==0)||(tNumber==0))
{
return "NO";
}
if(mA==0)
{
return "NO";
}

return "YES";
}

else
{
return "NO";
}

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐