【卡码网C++基础课 16.出现频率最高的字母】

2024-09-02 18:52

本文主要是介绍【卡码网C++基础课 16.出现频率最高的字母】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 题目描述与分析
  • 一、哈希表
  • 二、代码编写


题目描述与分析

题目描述:
给定一个只包含小写字母的字符串,统计字符串中每个字母出现的频率,并找出出现频率最高的字母,如果最高频率的字母有多个,输出字典序靠前的那个字母。

输入描述:
包含多组测试数据,每组测试数据占一行。

输出描述:
有多组输出,每组输出占一行。

输入示例:

2
abcdeef
aabbccddeeff

输出示例:

e
a

之前已经学习了数组、字符串、链表等数据结构,但是如果想要找到其中某个元素或者节点,需要从索引为0的位置或者表头开始,逐一进行比较,直到找到相等的位置或者末尾才会结束。

可以通过“哈希表”来避免之前的比较,直接通过要查找的记录直接找到其存储位置。哈希表是根据关键码key的值而直接进行访问的数据结构。哈希表的作用是快速判断一个元素是否出现在集合里,它的核心思想是在关键码和存储位置之间建立一个确定的对应关系f, 使得每个关键字key对应一个存储位置,而这个对应关系,称之为散列函数(哈希函数)。

其实数组就是一张哈希表,哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素。
哈希表来解决问题的时候,一般选择以下三种数据结构:
数组
set集合
map映射

一、哈希表

哈希表(Hash Table),也称为散列表,是一种使用哈希函数组织数据,以支持快速插入、查找和删除操作的数据结构。在哈希表中,数据项与一个键(Key)相关联,这些键通过哈希函数转换为数组的索引。

哈希表的基本原理:
1.哈希函数: 哈希函数将输入(通常是键)映射到一个固定大小的数字,这个数字通常是数组的索引。好的哈希函数应尽量减少不同键映射到同一索引的情况(即哈希冲突)。
2.键-值对: 每个键关联一个值,键-值对存储在哈希表的相应索引位置。
3.处理哈希冲突: 最常见的处理哈希冲突的方法包括链地址法(Separate Chaining)和开放寻址法(Open Addressing)。链地址法是通过在每个数组索引处维护一个链表来处理冲突,而开放寻址法则是通过在数组内寻找空闲位置来解决冲突。

哈希表的操作:
1.插入(Add):
计算键的哈希值得到索引。
根据处理冲突的策略将键-值对存储在哈希表中。
2.查找(Search):
计算键的哈希值以找到其可能存储的索引。
遍历该索引对应的链表或数组位置,查找是否存在该键。
3.删除(Delete):
计算键的哈希值找到该键可能存在的索引。
在该索引处找到并移除键-值对。

二、代码编写

照例先把代码的基础结构书写完整

#include <iostream>
#include <string>
using namespace std;
int main() {int n; // 接收n行数据string s; // 每行输入的字符串while(cin >> n) { // 题目包含多个输入while(n--) {cin >> s;// 接收输入的字符串}}
}

数组可以作为简单哈希表来使用,所以我们可以定义一个数组,来记录字符串s当中字符出现的次数。

由于输入的全都是小写字母,小写字母只有26个,那我们定义一个长度为26的数组即可,字符a到字符z的ASCII是26个连续的数值,所以字符a映射为下标0,相应的字符z映射为下标25。
在这里插入图片描述
在遍历 字符串s的时候,只需要将s[i] - 'a’所在的索引做+1 操作即可,并不需要记住字符a的ASCII,只要求出一个相对数值就可以了。 这样就将字符串s中字符出现的次数,统计出来了

// 统计各个字符出现的频率
for (int i = 0; i < s.size(); i++) {count[s[i] - 'a']++;
}

经过一轮遍历之后已经完成统计,数组中各位的元素已经是a-z字母的频次了,如果想要找到最大值,还是需要重新遍历一遍,那我们如何记录这个最大值呢?

只需要先初始化最大值,然后逐一比对字符出现的频次和当前最大值的大小,如果当前字符出现的频次大于最大值,则更新最大值为当前字符出现的频次,这样完整遍历一遍后,就能找到出现频次最大的字符。

// 初始化最大值
int flag = 0;
// 定义出现频次最多的字符为result
char result;
// 遍历数组,找到值最大的索引
for (int i = 0; i < 26; i++) {// 如果当前位置的数值大于最大值,则更新最大值,更新字符if (count[i] > flag) {// 更新最大值flag = count[i];// 更新字符result = i + 'a';}
}
// 输出结果
cout << result << endl;

完整代码如下:

#include <iostream>
#include <string>
using namespace std;
int main() {int n;string s;while (cin >> n) { // 题目中说包含多组测试数据,所以这里要持续输入while (n--) {cin >> s; // 输入字符串int count[26] = {0};// 统计各个字符出现的频率for (int i = 0; i < s.size(); i++) {count[s[i] - 'a']++;}int flag = 0;char result;// 找到出现频率最大的字符for (int i = 0; i < 26; i++) {if (count[i] > flag) {flag = count[i];result = i + 'a';}}cout << result << endl;}}
} 

这篇关于【卡码网C++基础课 16.出现频率最高的字母】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1130785

相关文章

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

C++字符串提取和分割的多种方法

《C++字符串提取和分割的多种方法》在C++编程中,字符串处理是一个常见的任务,尤其是在需要从字符串中提取特定数据时,本文将详细探讨如何使用C++标准库中的工具来提取和分割字符串,并分析不同方法的适用... 目录1. 字符串提取的基本方法1.1 使用 std::istringstream 和 >> 操作符示

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

C++ 各种map特点对比分析

《C++各种map特点对比分析》文章比较了C++中不同类型的map(如std::map,std::unordered_map,std::multimap,std::unordered_multima... 目录特点比较C++ 示例代码 ​​​​​​代码解释特点比较1. std::map底层实现:基于红黑

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

利用Python和C++解析gltf文件的示例详解

《利用Python和C++解析gltf文件的示例详解》gltf,全称是GLTransmissionFormat,是一种开放的3D文件格式,Python和C++是两个非常强大的工具,下面我们就来看看如何... 目录什么是gltf文件选择语言的原因安装必要的库解析gltf文件的步骤1. 读取gltf文件2. 提

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快