有人问我刷PAT有什么作用,我想告诉大家刷pat很有用的。很多互联网企业都会考察IT、DT、AI等相关领域的求职者算法方面的问题,也会要求相关人员会写c或者c++。像笔者之前面试的腾讯优图实验室(AI),他们都是用c或者c++来写的算法、面试的时候也问了我头插法等如何实现。刷PAT的话可以有效的帮助大家理解各种算法的实现和原理,还可以训练如何避免范围过大的问题,比如说int型最大为2147483647,那如果有一个数是3147483647该怎么处理等等。这些PAT的单点测试都会很好的训练你的。下面就正式上题吧。
字符串 APPAPT
中包含了两个单词 PAT
,其中第一个 PAT
是第 2 位(P
),第 4 位(A
),第 6 位(T
);第二个 PAT
是第 3 位(P
),第 4 位(A
),第 6 位(T
)。
现给定字符串,问一共可以形成多少个 PAT?
输入格式:
输入只有一行,包含一个字符串,长度不超过105,只包含 P
、A
、T
三种字母。
输出格式:
在一行中输出给定字符串中包含多少个 PAT
。由于结果可能比较大,只输出对 1000000007 取余数的结果。
输入样例:
APPAPT
输出样例:
2
这道题暴力解题的话肯定会超时,所以最好的思路就是以A为主体,求A两侧的P和T的个数,然后相乘再求和就是PAT的总个数了。下面上代码了:
#include <iostream>
#include <string>
using namespace std;
int main(){
int i,n,sum_p=0,sum_t=0,sum = 0,total,left_A[100010] = {0},right_A[100010] = {0};
string str;
cin >> str;
n = str.length();
for(i=0;i<n;i++){
if(str[i]=='P'){
sum_p++;
}
if(str[i]=='A'){
left_A[i] = sum_p;
}
}
for(i=n-1;i>=0;i--){
if(str[i]=='T'){
sum_t++;
}
if(str[i]=='A'){
right_A[i] = sum_t;
}
}
for(i=0;i<n;i++){
sum = (sum + left_A[i]*right_A[i])%1000000007;
}
total = sum % 1000000007;
cout << total << endl;
return 0;
}
以上代码可能会存在错误,如有错误还请在后台和我讨论,一起进步,当然对于代码有什么疑问的也可以在后台和我交流啊。
求一波关注(公众号:faceSchool)