java-1003 我要通过!

今天上午写了一上午,倒也不是非常难,只要推倒一下就能出来,但是我就是想知道自己为什么错啊啊啊啊啊

先贴题:

1003 我要通过!(20)(20 分)

答案正确”是自动判题系统给出的最令人欢喜的回复。本题属于PAT的“答案正确”大派送 —— 只要读入的字符串满足下列条件,系统就输出“答案正确”,否则输出“答案错误”。

得到“答案正确”的条件是:

1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;\

  1. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;\
  2. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

现在就请你为PAT写一个自动裁判程序,判定哪些字符串是可以获得“答案正确”的。

输入格式: 每个测试输入包含1个测试用例。第1行给出一个自然数n (&lt10),是需要检测的字符串个数。接下来每个字符串占一行,字符串长度不超过100,且不包含空格。

输出格式:每个字符串的检测结果占一行,如果该字符串可以获得“答案正确”,则输出YES,否则输出NO。

输入样例:

8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA

输出样例:

YES
YES
YES
YES
NO
NO
NO
NO

之后就是令人愉悦的分析问题的阶段了

条件1:

    字符串中只有PAT三种字符

条件2:形如AAPATAA或者AAAAPATAAAA的都是对的,反正就是中间一个PAT,两遍要么没有A,要么A个数相同

条件3:若aPbTc成立,则aPbATca成立

根据条件三,我们有:

    由于PAT成立,故PAAT成立,故PAAAT成立,....,故PA...T成立

    由于APATA成立,故APAATAA成立,故APAAATAAA成立,...,故AP[n个A]T[n个A]成立

    由于AAPATAA成立,故AAPAATAAAA成立,故AAPAAATAAAAAA成立,...,故AAP[n个A]T[n * 2个A]成立

所以,形如PA......T的一定是成立的

形如[n个A]P[m个A]T[n * m个A]也是成立的

当然,条件2、3是基于条件1的。

之后就是我们的解题环节了

1.首先需要获取我们需要的数据:

private static String[] getStringArray() throws Exception {
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
        int length = Integer.parseInt(bufferedReader.readLine());
        String[] result = new String[length];
        for (int i = 0 ; i < length ; i ++) {
            result[i] = bufferedReader.readLine();
        }
        return result;
    }

2.之后我们要写如何输出:

public static void method(String[] target) {
        for (int i = 0 ; i < target.length ; i ++) {
            if (judge(target[i])) {
                System.out.println("YES");
            } else {
                System.out.println("NO");
            }
        }
    }

3.其中有一个方法便是判断每个字符串是否正确,方法如下:

private static boolean judge(String s) {
        char temp = ' ';//临时变量
        int num1 = 0, num2 = 0, num3 = 0;//两个计数变量
        int i = 0;
        for ( ; true ; i ++) {
            temp = s.charAt(i);
            if (temp == 'A') {
                num1 ++;
            } else if (temp == 'P') {
                break;
            } else {
                return false;
            }
        }
        for (i ++ ; true ; i ++) {
            temp = s.charAt(i);
            if (temp == 'A') {
                num2 ++;
            } else if (temp == 'T') {
                break;
            } else {
                return false;
            }
        }
        for (i ++ ; i < s.length() ; i ++) {
            temp = s.charAt(i);
            if (temp == 'A') {
                num3 ++;
            } else {
                return false;
            }
        }
        if (num1 == 0 && num2 != 0 && num3 == 0)
            return true;
        if (num1 != 0 && num2 != 0 && num3 != 0)
            return num3 - num1 == num1 * (num2 - 1);
        return false;
    }

但是咧~~~,这个判断方法有问题,我在PTA上过不了。求助各位,,,不知道自己错在什么地方也是非常苦闷的一件事情。

  • 6
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 3
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:书香水墨 设计师:CSDN官方博客 返回首页
评论 3

打赏作者

aptx1048576

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值