数据结构与算法-字符出现的次数

问题描述

以下是这个找出字符串中字符串出现频率最多的字符。大家可以自行研究一下,题目不难,我今天尝试使用C语言来完成解答,但是在解答过程居然出现了一个意想不到的问题。可能是高级语言用多了,C语言某些函数的限制和风险忘记管控了o( ̄︶ ̄)o

在这里插入图片描述

解题思路

这种题目类似于hash的算法,也就是说我们可以使用数组索引[下标]来表示字母。

  • 例如字母’A’ 可以看做 ‘A’-‘A’ ,索引为0, ‘a’-‘a’ 索引为0,(tips,题目不区分大小写字母),
  • 字母’s’可以算出索引 int index = ‘s’ -‘a’ …, 依次类推。
  • 我就用索引表示字符,索引对应的数组的值表示出现次数,例如 a[0] =3,表示字符’a’或者’A’出现三次。

程序实现

输入字符串

char str[1000001];
if (fgets(str, sizeof(str), stdin) == NULL) {
        return 1;
}str[strcspn(str, "\n")] = 0;

遍历字符串更新数组中的出现次数

int a[26] = {0};
int max = 0;
char ch;
size_t len = strlen(str);
for (int i = 0; i < len; i++) {
    if (str[i] >= 'A' && str[i] <= 'Z' || str[i] >= 'a' && str[i] <= 'z') {
        int index = str[i] - (str[i] >= 'a' ? 'a' : 'A');
        a[index] += 1;
     } else {
          continue;
        }
    }

找出出现次数最多的字符

这里使用max记录出现次数为了比较,使用ch记录字符
因为数组的索引顺序(即字符顺序从a-z)自然满足了题目要求如果出现相同的只显示小的那个字符

  for (int i = 0; i < 26; i++) {
        if (max < a[i]) {  //只要比最大值大就交换,如果相同不处理
            max = a[i];
            ch = (char) i;
        }
    }

运行结果

sdfsfsd342452423
s 3

问题与处理

以上是修正后的代码,在之前版本中使用的是gets()函数进行输入,程序总报“含有较多字符”。在屡次实验分析之后发现C语言的gets()有可能造成输入的缓存溢出,也就是说输入的数量过大导致字符数组越界隐患。所以提交总是不能通过。
在这里插入图片描述
之后我们使用fgets替换了gets()函数解决了这一问题。

在这里插入图片描述

总结

以后在使用C语言这种未进行安全检查的语言时,需要程序员仔细分析函数的适用条件,代码可能存在的风险,保证代码的健壮性,这样你的开发能力才能有很大的提升。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/721321.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

携手精益生产培训机构,让职业发展更上一层楼!——张驰咨询

精益生产培训机构在职业发展中的关键作用不容忽视。对于许多初入职场或希望深化精益生产理解的从业者来说&#xff0c;这些机构如同一盏明灯&#xff0c;照亮了前行的道路。 首先&#xff0c;精益生产培训机构是知识的集中地。它们不仅提供了全面的理论框架&#xff0c;还涵盖了…

数据可视化实验三:Matplotlib绘图

目录 一、绘制斜率为3和5的直线图 1.1 代码实现 1.2 绘制结果 二、使用Matplotlib绘制招聘职位数量关系的线图&#xff0c;通过Pandas读取数据绘制折线图 2.1 代码实现 2.2 绘制结果 三、使用Matplotlib绘制房价与房屋面积的散点图&#xff0c;数据通过Pandas读取表格 3…

Linux中DNS搭建

文章目录 一、DNS介绍1.1、DNS是什么1.2、DNS的工作原理1.3、DNS的域名结构 二、Bind介绍2.1、bind概述2.2、bind主要配置文件 三、DNS安装四、主要配置文件解析&#xff08;除/etc/named.conf&#xff09;4.1、/etc/named.rfc1912.zones4.2、/etc/rc.d/init.d/named4.3、/etc/…

上海AI Lab推出8B模型,奥数成绩媲美GPT-4

只用1/200的参数&#xff0c;就能让大模型拥有和GPT-4一样的数学能力&#xff1f; 复旦大学和上海AI实验室的研究团队刚刚研发出了一款具有超强数学能力的模型。 这款模型名为MCTSr&#xff0c;以Llama 3为基础&#xff0c;参数量只有8B&#xff0c;却在奥赛级别的题目上取得了…

3.Nginx配置文件基本介绍

nginx配置文件所在路径:/usr/local/nginx/conf/nginx.conf nginx配置文件有三块: 1.全局块 从配置文件开始到events块之间的内容,主要会设置一些影响nginx服务器整体运行的配置指令。 配置运行nginx服务器的用户(组)允许生成的worker process数,Nginx服务器并发处理服务…

现货白银买卖网站靠什么生存?

现货白银交易平台的官网是该企业在互联网上的门面&#xff0c;它向外界展示了平台的形象、文化和价值观。通过官网&#xff0c;投资者可以了解一家现货白银交易平台的发展历程、服务特色等&#xff0c;从而形成对平台的整体印象。 现货白银平台的官网是其发布官方信息、新闻动态…

JVM 性能分析案列——使用 JProfiler 工具分析 dump.hprof 堆内存快照文件排查内存溢出问题

在 windows 环境下实现。 参考文档 一、配置 JVM 参数 配置两个 JVM 参数&#xff1a; -XX:HeapDumpOnOutOfMemoryError&#xff0c;配置这个参数&#xff0c;会在发生内存溢出时 dump 生成内存快照文件&#xff08;xxx.hprof&#xff09;-XX:HeapDumpPathF:\logs&#xff…

Android ViewModel实现和原理

ViewModel实现和原理 前言1. 使用1.1 gradle准备1.2 模拟场景1.3. LiveData和ViewModel1.4 更新数据 2. 原理与源码解读2.1 添加观察者2.2 setValue2.3 post 参考资料 前言 ViewModel的主要基于观察者的设计模式&#xff0c;他主要分为两个部分&#xff1a; 提供者Provider&a…

RK3588/算能/Nvidia智能盒子:[AI智慧油站」,以安全为基,赋能精准经营

2021年9月&#xff0c;山东省应急管理厅印发了关于《全省危险化学品安全生产信息化建设与应用工作方案&#xff08;2021-2022 年&#xff09;》的通知&#xff0c;要求全省范围内加快推进危险化学品安全生产信息化、智能化建设与应用工作&#xff0c;建设完善全省危险化学品安全…

游戏服务器研究一:bigworld 开源代码的编译与运行

1. 前言 bigworld 已经开源了它的代码&#xff0c;而我对于大世界的 scale 很感兴趣&#xff0c;所以就尝试把代码跑起来研究。但是&#xff0c;整个过程比我原先预想的复杂得多。 虽然能找到一些官方的帮助文档&#xff0c;但这些文档要么过旧&#xff0c;要么过于详尽&…

0元体验苹果macOS系统,最简单的虚拟机部署macOS教程

前言 最近发现小伙伴热衷于在VMware上安装体验macOS系统&#xff0c;所以就有了今天的帖子。 正文开始 首先&#xff0c;鉴于小伙伴们热衷macOS&#xff0c;所以小白搜罗了一圈macOS系统&#xff0c;并开启了分享通道。 本次更新的系统版本是&#xff1a; macOS 10.13.6 ma…

B端业务需求分析的3大注意事项

通过深入分析业务需求&#xff0c;可以准确理解B端用户的具体需求&#xff0c;帮助项目团队设计出真正解决企业问题、提高工作效率的产品或服务。这减少了后期变更&#xff0c;节约了时间和资源。如果没有深入分析业务需求&#xff0c;产品或服务功能可能与实际业务需求脱节&am…

街道网格宣传稿件投稿我知道了好方法

作为街道信息宣传员,我的日常是将街道的每一项重要活动、每一份温暖故事编织成文字,传递给公众。这份工作既充满挑战又极具意义,但在最初,我却在这份看似简单的任务上屡屡受阻。那时,我的投稿方式单一且传统——依赖电子邮件,将稿件发送至各大媒体的投稿箱。我本以为,只要内容足…

【讲解下Pip换源】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

【Redis】java客户端(SpringData和jedis)

https://www.oz6.cn/articles/58 https://www.bilibili.com/video/BV1cr4y1671t/?p16 redis官网客户端介绍&#xff1a;https://redis.io/docs/latest/develop/connect/clients/ jedis maven引入依赖 <dependencies><!--引入Jedis依赖--><dependency><…

Jmeter 性能测试步骤是什么?

性能测试是软件开发过程中非常重要的一环。它可以帮助我们评估软件系统在不同负载下的性能表现&#xff0c;找出系统中的性能瓶颈&#xff0c;并提供改进方案。而JMeter作为一款功能强大且广泛使用的性能测试工具&#xff0c;可以帮助我们实现这一目标。 下面&#xff0c;我将…

算法课程笔记——线段树维护矩阵

算法课程笔记——线段树维护矩阵 2

Elasticsearch:简化数据流的数据生命周期管理

作者&#xff1a;来自 Elastic Andrei Dan 今天&#xff0c;我们将探索 Elasticsearch 针对数据流的新数据管理系统&#xff1a;数据流生命周期&#xff0c;从版本 8.14 开始提供。凭借其简单而强大的执行模型&#xff0c;数据流生命周期可让n 你专注于数据生命周期的业务相关方…

总结一下 C# 如何自定义特性 Attribute 并进行应用

前言 Attribute&#xff08;特性&#xff09;是一种用于为程序元素&#xff08;如类、方法、属性等&#xff09;提供元数据信息的方法。 特性是一种声明式的信息&#xff0c;附加到程序元素上&#xff0c;提供额外的数据用于描述和控制这些元素的行为。 在编译和运行时&…

项目准备和启动

1.什么是项目建议书&#xff1f; 2.项目建议书的内容 3.可行性分析方法 4.项目组织结构&#xff08;职能型 项目型 矩阵型&#xff09; 5.项目管理层决策层执行层之间的关系 6.软件项目的可行性分析包括哪几个方面&#xff1f;影响决策的关键因素又是什么&#xff1f; 软件项目…