PAT1003 JAVA

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");
			
		}
	}
}

参考

能力有限,代码主要参考以下,略做调整和注释。

https://blog.csdn.net/qq_26580757/article/details/87861752?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164191333016780366597867%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164191333016780366597867&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-87861752.pc_search_result_cache&utm_term=PAT1003%E6%88%91%E8%A6%81%E9%80%9A%E8%BF%87java+&spm=1018.2226.3001.4187

经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的数量,这里略作修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值