本期导航
导语:
哈喽,我是在汤锅泡澡的任易仙!结束了c语言的基础学习又经过很长时间的摸爬滚打摆烂,我“终于”可以使用c++来写算法题了。从c进阶到入门c++,给我最大的感受就是,vocal,好方便。当很多算法封装成语法时,调用起来真的叫个得心应手。今天我继续分享一道简单的题目,此题若用c语言写,或许需要运用俩个指针进行子串的比较,但是利用c++的string类语法知识,可以直接秒杀,话不多说,直接上题。
正文:
题目
(本题来源牛客竞赛NC14112 Check in)
思路历程
首先,这是一个多次执行的题型,自然需要输入一个预执行值。在每次执行时,需要输入队伍的数量,和各个队伍的名称。我认为,这题的关键是在众多队伍中找到本校的名称——“bnu”,并执行计数。明显的,这是一道判定字符串是否为子串的题型。做这道题前,我好巧不巧的了解了c++的string类。而关于判定子串是否存在有一个非常方便的方法函数——find()。该函数的作用为返回字符串在母字符串中最早出现的相同子串的首字母下标,如果找不到则返回一个特殊值(-1或一个很大的数)
ps:关于find()函数找不到子串时返回的值,我输出时是一个很大的数,但是和-1比较是否相等时返回为真,具体原因尚不清楚,希望有大佬能解释一下。
利用find()方法函数,我们便可以轻松的判定队伍名中是否含有“bnu”。于是我写出了这样一个代码:
#include<iostream>
using namespace std;
int main(){
//开辟数组存放每次执行的计数结果
int T,n,i,s[1000]={0};
cin>>T;
string a[100];
for(i=0;i<T;i++){
cin>>n;
for(int j=0;j<n;j++){
//录入队伍名
cin>>a[j];
//判定是否为本校
if(a[j].find("bnu")==0)
s[i]++;
}
}
for(i=0;i<T;i++){
cout<<s[i]<<endl;}
return 0;
}
在判定时,我一开始认为如果find()函数返回等于0,那么就是以“bnu”开头的队伍,应该就是“本校队伍”。but,测试用例过了,但是提交时却没有过。为什么呢?想了一会,测试案例让我思维固化了,队伍名字中“bnu”的后面可以跟上其他字母,比如说“bnua”,这样明显就是满足算法条件但不符合题意了。在我想着如何解决时,瞅了一眼题,哦!队伍名称后面会跟上“16”。这是个很好的限制,所以查找的子串应该是“bnu16”。修改后的最终代码如下:
#include<iostream>
using namespace std;
int main(){
//开辟数组存放每次执行的计数结果
int T,n,i,s[1000]={0};
cin>>T;
string a[100];
for(i=0;i<T;i++){
cin>>n;
for(int j=0;j<n;j++){
//录入队伍名
cin>>a[j];
//判定是否为本校
if(a[j].find("bnu16")!=-1)
s[i]++;
}
}
for(i=0;i<T;i++){
cout<<s[i]<<endl;}
return 0;
}
题目就被秒了。
结语:
虽然刚从c过渡到c++,就通过新学的语法知识秒了一道简单算法题。但这并不意味c++就被我掌握了,更丰富的功能,面向对象的编程思想,都是更为重要且需要长期学习的!