1003. 我要通过!(20)

1003. 我要通过!(20)

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

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

1. 字符串中必须仅有P, A, T这三种字符,不可以包含其它字符;
2. 任意形如 xPATx 的字符串都可以获得“答案正确”,其中 x 或者是空字符串,或者是仅由字母 A 组成的字符串;
3. 如果 aPbTc 是正确的,那么 aPbATca 也是正确的,其中 a, b, c 均或者是空字符串,或者是仅由字母 A 组成的字符串。

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

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

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

输入样例:
8
PAT
PAAT
AAPATAA
AAPAATAAAA
xPATx
PT
Whatever
APAAATAA
输出样例:
YES
YES
YES
YES
NO
NO
NO
NO

解题思路:这道题的题目似乎很难读懂,在借助其他同行的点拨之后,稍微有点思路。按照1,2,3一步步走,逐一写出符合条件的字符串,然后找出规律,用代码实现它。。具体是这样实现的:
    1、只包含 P,A,T三种字符,并且三个字符一定存在;
    2、APATA、AAPATAA、AAAPATAAA都是正确的,所以两边的话,可以加上相同个数的A;
    3、在2的基础上,可以推导出若干正确的答案。PAAT,PAAAT,PAAAAT……;APAATAA,APAAATAAA,AAPAATAAAA,AAAPAATAAAAAA……
由此,我们可以得出:
只包含一个P以及一个T,A的数量>=1待定;
而且P、T的位置是固定的,根据判断可以直接返回False;
在P左侧,T的右侧以及PT的中间加上若干的A,使A的数量上满足一定规律:暂且标记为   a1  P  a2  T  a3,
                                                                                                                                    有:a1  *   a2  =  a3

怎么用代码实现它呢???

版本1、C++
#include <iostream>
#include <string>
using namespace std;

bool passOK(string str) {
	int len = str.length();  
	int na[3] = {0};  //定义一个存放A数量的数组
	int idx = 0,      //索引参数
	    np = 0,       //P的数量
	    nt = 0;       //T的数量
	if (len <= 2) {             //直接返回
		return false;
	}
	for (int i = 0; i < len; i++) {  //遍历整个数组,对P,A,T的各个数量进行统计,放入数组里;
		if (str[i] == 'A') {     //判断特定情况下的return false
			na[idx] += 1;
		}
		else if (str[i] == 'P') {
			if (np > 0) return  false;
			np += 1;
			idx += 1;
		}
		else if (str[i] == 'T') {
			if (np == 0 || nt > 0) return false;
			nt += 1;
			idx += 1;
		}
		else return false;
	}
	if (na[0] * na[1] == na[2] && na[1] > 0) {  //主要判断条件
		return true;
	}
	return false;
}

int main() {
	int n;
	string s;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> s;
		if (passOK(s) == true)
			cout << "YES" << endl;
		else
			cout << "NO" << endl;
	}
	//system("pause");
	return 0;
}



版本2、Python
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2016/12/6 13:57
# @Author  : WuFan

def passOK(string):
    na = [0, 0, 0]  # 定义a1,a2,a3分别代表A的数量
    idx, np, nt = 0, 0, 0  # 定义P和T的数量参数,还有idx参数代表位置(P前,PT中,还是T后,很关键)
    if len(string) <= 2:  # 直接返回
        return False
    for i in string:
        if i == 'A':
            na[idx] += 1
        elif i == 'P':
            if np > 0:
                return False
            np += 1
            idx += 1
        elif i == 'T':
            if np == 0 or nt > 0:
                return False
            nt += 1
            idx += 1
        else:
            return False

    if na[0] * na[1] == na[2] and na[1] > 0:
        return True
    return False

if __name__ == "__main__":
    n = int(input())
    for i in range(n):
        string = input().strip()  # 对于这个地方的str.strip(),是默认删除空白符(包括'\n', '\r',  '\t',  ' '),不加在官方OJ可以通过,但在牛客过不了;加了均可以通过
        if passOK(string):
            print('YES')
        else:
            print('NO')

注意:许多可以return False 的地方,早点 return 可以使算法更加效率;
            idx的设置是以后可以学习的地方,很巧妙;
  str.strip() 的功能后面也可以用到,还记得它的用法吗?

声明:s为字符串,rm为要删除的字符序列

s.strip(rm)        删除s字符串中开头、结尾处,位于 rm删除序列的字符

s.lstrip(rm)       删除s字符串中开头处,位于 rm删除序列的字符

s.rstrip(rm)      删除s字符串中结尾处,位于 rm删除序列的字符

1. 当rm为空时,默认删除空白符(包括'\n', '\r',  '\t',  ' ')     
>>> a = '     123'
>>> a.strip()
'123'
>>> a='\t\tabc'
'abc'
>>> a = 'sdff\r\n'
>>> a.strip()
'sdff'

2.这里的rm删除序列是只要边(开头或结尾)上的字符在删除序列内,就删除掉。
>>> a = '123abc'
>>> a.strip('21')
'3abc'   结果是一样的
>>> a.strip('12')
'3abc'



### 回答1: POSIX是一个为了提高计算机系统互操作性而制定的一系列标准。POSIX 1003是在1988年由IEEE制定的一项标准,也被称为POSIX.1或UNIX标准。它包含了一系列操作系统接口的定义,如文件操作、进程管理、信号处理、线程管理等。POSIX 1003旨在使不同的UNIX系统之间具有更好的兼容性,以便软件可以在不同的UNIX系统上进行移植。 POSIX 1003的主要目标是为了提供一个通用的操作系统接口,不仅仅限于UNIX系统,也可以应用于其他类UNIX的操作系统。这样可以方便开发人员编写一次代码,就能在多个UNIX系统上运行,并且充利用各个系统的功能和特性。 POSIX 1003规定了一系列C语言的API,开发人员可以使用这些API调用来实现各种操作系统相关的功能。这些API包括了文件I/O、进程管理、线程管理、信号处理等常见的操作系统功能。通过使用POSIX 1003,开发人员可以编写出更具可移植性的代码,从而减少了在不同UNIX系统上移植代码的工作量。 除了POSIX 1003之外,还有其他的POSIX标准,如POSIX 1003.1b(对于实时扩展)、POSIX 1003.1c(对于国际化扩展)等。这些标准在不断地发展和更新,以适应不断变化的计算机系统需求。虽然POSIX标准是为UNIX系统设计的,但很多非UNIX操作系统也在采用POSIX标准,以提供更好的兼容性和一致性。 总而言之,POSIX 1003是一个标准化的接口集合,旨在提高计算机系统的兼容性和可移植性。通过遵循POSIX 1003,开发人员可以更轻松地编写跨平台的应用程序,从而提高工作效率。 ### 回答2: POSIX (Portable Operating System Interface) 1003是一组操作系统接口标准,目的是为了提供操作系统内核与应用程序之间的标准接口。 POSIX 1003标准最初由IEEE (Institute of Electrical and Electronics Engineers) 开发,并于1988年发布。该标准的目的是为了提供可移植性,使得应用程序可以在不同的操作系统上运行,而无需进行大量的修改。POSIX 1003标准为开发者提供了一组系统调用、库函数和工具命令,以及用于描述系统行为的规范。 POSIX 1003标准涉及多个领域,包括文件系统、进程管理、线程、信号处理、网络通信等。通过采用POSIX 1003标准,开发者可以使用一致的API来访问这些功能,而不必考虑底层操作系统的差异。 举例来说,POSIX 1003的文件系统API定义了一组函数来操作文件和目录,如打开、读取、写入、关闭文件等。无论是在Windows系统还是在Linux系统,开发者可以使用相同的函数调用来实现这些操作。这样一来,开发者只需要编写一次代码,即可在不同的操作系统上运行,从而提高了代码的可移植性和开发效率。 此外,POSIX 1003还定义了一系列环境变量、系统错误码、管道机制等,进一步增强了系统间的统一性和互操作性。 综上所述,POSIX 1003是一种可以跨不同操作系统平台使用的标准接口。它提供了一致的API,促进了可移植性和代码的重用性,使开发者能够更轻松地开发和维护跨平台的应用程序。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值