【题目链接】
ybt 1148:连续出现的字符
OpenJudge NOI 1.9 11:连续出现的字符
【题目考点】
1. 字符串处理
2. 数值统计
【题解代码】
解法1:比较相邻字符
#include<bits/stdc++.h>
using namespace std;
int main()
{
int k, cn = 1, len;//cn:字符连续出现的次数
cin>>k;
char s[2505];
cin>>s;
if(k == 1)//如果k为1,为特例。
{
cout<<s[0];//直接输出第0个字符,即为连续出现1次的字符
return 0;
}
len = strlen(s);
for(int i = 1; i < len; ++i)
{
if(s[i] == s[i-1])//如果现在看的字符和前一个字符相同
{
cn++;//那么字符连续出现,连续出现的次数加1
if(cn >= k)//如果已经连续出现k次
{
cout<<s[i];//输出这个字符
return 0;//结束程序
}
}
else//如果当前字符与前一个字符不同
cn = 1;//那么重新开始计数,当前字符连续出现1次
}
cout<<"No";//如果没有能达到连续出现k次的情况,输出No
return 0;
}
解法2:设一个变量,用于表示当前关注的连续字符
#include<bits/stdc++.h>
using namespace std;
int main()
{
int k, ct, len;
cin>>k;
char s[2505], c;//c:当前关注的,在连续出现的字符
cin>>s;
c = '\0';//c的初始值如果是'\0',则一定不会与s[0]相同,因而第一次循环时会执行else下的语句段,为c与ct赋初值
len = strlen(s);
for(int i = 0; i < len; ++i)
{
if(s[i] == c)//如果当前看的字符s[i]与关注的字符c相同
ct++;//计数加1
else//如果看到与c不同的字符(第一次循环,i为0时,也会走这里)
{
c = s[i];//改变关注的字符为s[i]
ct = 1;//重新计数
}
if(ct >= k)//如果已经连续出现k次
{
cout<<c;
return 0;
}
}
cout<<"No";
return 0;
}