c语言的练习-字符串的练习-寻找最长连续字符以及出现次数

由于作者小白是一个初学者,我在写这题的时候被这题的输入输出卡了很久竟然。

我还以为是我里面的哪个逻辑错了。后面询问了老师,才知道自己错在哪里。

所以多做题还是好处有很多了。

那么话不多说开始今天的讲解。

首先我先说我今天遇到的问题。

就是这个输入输出的问题。

由于这道题要输入 一个未知数 n.代表我们有几个字符串要处理。

所以我们首先要定义一个未知数n,并输入它。

但是我们在进行后边字符串的读入的时候,必定会在输入这个n 之后有一个换行

我们 用 %d ,%f , %s 等格式说明符时,输入时按回车产生的换行符会残留在缓冲区

于是当我想要输入第一个字符串时,就会出现如下的结果

我们这里再对比一下正确答案

于是这个换行符就占用了第一个字符串

产生了错误。

想要处理这个问题,就要在输入这个n之后,加一个 getchar()读出来这个回车之后,再fgets()我们的字符串。

这里我们定义的数组 ch[205],虽然最多只要200个字符,但是这里我们定义205个,为了防止出现边界性问题,防止数组越界,以及有时有助于算法的实现,能够提高代码的健壮性。

第一部分的代码如下

#include<stdio.h>

#include<string.h>

int main(){

int n;

char ch[205];

scanf("%d",&n);

getchar();

然后我们进入循环。

我们想要找到最大连续长度的字符串。并且找到那个字符,以及它到底多长

于是我们就有了三个变量,为了形象一些,这里我们使用它们的英文,增强可读性。

maxcount=0 , maxchar=ch[0],

count=1;

这里我们想为什么 count 是 1 呢。

因为我们要比较 前一个和后一个字符,是不是一样的。如果一样 count++,

但是此时有两个相同的字符 所以我们的起始 count=1.

进入 循环对比。因为我们是跟前一个字符作比较,所以我们这里 j=1。(稍后讲解与后一个字符比较,差别不是很大)

如果这个字符 和前一个字符一致

ch[j]==ch[j-1]

那么count++;

当这个字符和前一个字符不一致的时候,那么此时判断 count 和 maxcount的大小

如果 count> maxcount 那么 maxcount=count;

因为此时这个字符和前一个字符不同,所以我们统计的是上一个字符的个数。

则 maxchar = ch[j-1],

if(count > maxcount){

maxcount=count;

maxchar=ch[j-1];

}

这里是 j从零开始比较它下一个数字的代码

做完这些以后 我们此时 遇见不一样的字符了。

所以我们的 count 要更新为 1;

count=1;

接下来是第二部分的代码

for(int i=0;i<n;i++){

scanf("%s",ch);

int maxcount=0;

int maxchar=ch[0];

int count=1;

for(int j=1;j<len;j++){

if(ch[j]==ch[j-1]){

count++;

} else{

if(count>maxcount){

maxcount=count;

maxchar=ch[j-1];

}

count=1;

}

}

是不是以为到这里就结束了。

不是的。

当时我自己做的时候,也认为结束了。

但是我画一个图,你们肯定就知道为什么了

因为我们的算法是遇到不一样的字符去统计上一个的字符的count.并与maxcount做比较。

所以当我们遇到最后一个不一样的字符以后,最后这一串相连续的字符,我们没有统计到

所以我们要再统计一次。

才完成我们的题目

然后输出就可以了

if(count>maxcount){

maxcount=count;

maxchar=ch[len-1];

}

printf("%c %d\n",maxchar,maxcount);

}

return 0;

}

如果你觉得作者的思路还行的话,不妨给小白作者留下一个点赞吧。

感谢您的阅读

接下来是完整代码

#include<stdio.h>

#include<string.h>

int main(){

int n;

char ch[205];

scanf("%d",&n);

for(int i=0;i<n;i++){

scanf("%s",ch);

int len=strlen(ch);

if(ch[len-1]=='\n'){

ch[len-1]='\0';

}

int maxcount=0;

int maxchar=ch[0];

int count=1;

for(int j=1;j<len;j++){

if(ch[j]==ch[j-1]){

count++;

} else{

if(count>maxcount){

maxcount=count;

maxchar=ch[j-1];

}

count=1;

}

}

if(count>maxcount){

maxcount=count;

maxchar=ch[len-1];

}

printf("%c %d\n",maxchar,maxcount);

}

return 0;

}

相关推荐
计算机安禾6 小时前
【c++面向对象编程】第27篇:空类的大小为什么是1?——C++对象标识的秘密
开发语言·c++·算法
玄米乌龙茶1236 小时前
项目开发学习笔记
笔记·学习
信竞星球_少儿编程题库7 小时前
2026年全国信息素养大赛算法应用主题赛 丝路新城 Python 模拟卷(三)
开发语言·python·算法
云泽8087 小时前
笔试算法 - 滑动窗口篇(二):从异位词到最小覆盖子串的通用框架
c++·算法
qq_296553277 小时前
[特殊字符] 搜索插入位置:从O(n)到O(log n)的优雅进化
数据结构·算法·面试·分类·柔性数组
凯瑟琳.奥古斯特7 小时前
力扣3654:二维矩阵连续空位统计
数据结构·数据库·算法·职场和发展
basketball6167 小时前
并查集基础算法总结 C++ 实现
开发语言·c++·算法
闫记康7 小时前
Linux学习day3
linux·服务器·学习