【代码随想录python笔记整理】第十六课 · 出现频率最高的字母
前言:本笔记仅仅只是对内容的整理和自行消化,并不是完整内容,如有侵权,联系立删。
一、哈希表初步
在之前的学习中,我们使用数组、字符串、链表等等,假如需要找到某个节点,则都要从头开始,逐一比较,直到找到为止。为了能够直接通过要查找的记录找到其存储位置,我们选择使用哈希表实现此功能。哈希表其实就是通过一个关键码 key 的值而直接进行访问的数据结构。
哈希表的作用是快速判断一个元素是否出现在集合,它通过在关键码和存储位置之间建立一个确定的对应关系 F(key) ,使得每个关键字 key 对应一个存储位置,而这个对应关系,称之为散列函数(哈希函数)。哈希表来解决问题的时候,一般选择以下三种数据结构:数组、集合、映射。
二、最简单的一个数组案例
下面我们来看一个有哈希思想的程序案例,但实质上这个程序和哈希表的应用关系不大。主要是帮助我们理解哈希表是什么,它的核心思想是什么。
对于这个问题,我们可以这样想:想要找出出现频率最高的字母,我们至少需要遍历一遍整个字符串,因此尽可能在这一遍中完成所有任务。
为了实现这个目的,我们可以将26个字母按次序存储在一个数组中,而数组的索引和字母实现了一一对应,如果把 ASCLL 码和索引的关系写出来,那就是 ASCLL - 97 = 索引。这就是一种哈希函数。所以我们也常常把数组称为是最简单的一种哈希表。
接下来,我们在遍历过程中,将遇到的每个字符都记为出现 1 次,并将其对应索引的位置数值加一。在完成遍历后,显然我们还需要找出索引位置处数值最大的是哪个字符,以及出现了多少次。为实现这一步,我们又需要重新遍历一遍字符串。
三、代码展示
n = int(input())
for _ in range(n):
s = input()
# 创建一个 长度为26,元素都为0的列表
temp = [0] * 26
for char in s:
# 计算字符在列表中对应的索引
a = ord(char) - ord('a')
# 索引对应的值 + 1
temp[a] += 1
maxFreq = 0
maxFreqChar = -1
# 遍历列表,找到最大频率字符的索引
for i in range(26):
if temp[i] > maxFreq:
maxFreq = temp[i]
# maxFreqChar为对应的索引
maxFreqChar = i
# 根据索引转换对应的字符
res = chr(ord('a') + maxFreqChar)
print(res)
四、总结
本节内容我们学习到了数组(列表)作为哈希表的使用,下节课我们会学习哈希表的另外一种形式`set集合`。