算法学习之 Python 实现单词分析-找出现次数最多的字母的 n 中方式

差点忘了我可是要打蓝桥杯的人,快临阵磨枪一下

单词分析-找出现次数最多的字母

题目描述

小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。

现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这个字母出现的次数。

输入描述

输入一行包含一个单词,单词只由小写英文字母组成。

对于所有的评测用例,输入的单词长度不超过 1000。

输出描述

输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪个。如果有多个字母出现的次数相等,输出字典序最小的那个

第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数

代码分析

方法一

# 输入单词
word=input()
maxNumChar=0
list=[]

# 找到出现得最多的那个字母在单词中出现的次数
for i in word:
  a=word.count(i)
  if a>maxNumChar:
    maxNumChar=a

# 根据上次找到的字母的数量找字母
for j in word:
  if word.count(j)==maxNumChar:
    list.append(j)
    
# 如果出现次数一致按字典顺序排序
list.sort
print(list[0])    
print(maxNumChar)

该方法适用于单词中大小写混用的情况

方法二

a = input()
b = [0]*256
for i in a:
  b[ord(i)]=b[ord(i)]+1
print(chr(b.index(max(b))))
print((max(b)))

摘自蓝桥杯官网单词分析-LOU4031234002 的代码,一开始看有点懵,就是用字母对应 ASCII 十进制数字作为下标的列表存储对应的出现次数

image-20220227151313223

方法三

其中还可以把方法一中的找出现得最多的那个字母在单词中出现的次数用以下代码代替

def max_num(n):
  c = max(n, key=n.count)
  return n.count(c)
# key 可以对要比较的对象进行一些处理,以达到对对象进行特定规则的比较

这里有一个问题可以思考,这里的 c 不就是出现次数最多的字母么,能不能直接输出呢,答案是可以而且更简单代码就是下面的方法 1,题目给出了条件如果有多个字母出现的次数相等,输出字典序最小的那个,且输入单词只有小写字母,为什莫只有小写字母很重要,看完以下代码比较你就知道了

a = "aaaaaaBBBBBB"

# 方法1
maxnum=max(a, key=a.count)
maxcount=a.count(maxnum)
print("%c\n%d" %(maxnum,maxcount))

# 方法2
b = [0]*256
for i in a:
  b[ord(i)]=b[ord(i)]+1
print(chr(b.index(max(b))))
print((max(b)))

# 方法3
s=a
m=sorted(sorted(s),key=lambda x:s.count(x),reverse=True)[0]
print(m,s.count(m),sep='\n')

输出如下

image-20220227153937341

在方法 2 和 3 中因为 B 的 ASCII 值为 66 而 a 的 ASCII 值为 97,从前向后找先找到的是 B,所以这两种方法适用于单词只有大写或小写的情况

之所以方法 1 可以正确输出只是因为它取的是出现次数最多的字母的第一个,如果 a=“BBBBaaaa”,输出结果依然是 B

总结

所有方法均可完成题目,但以上几种方法只有第一种适合于大小写混合情况

更多关于 max 函数的用法

获取字典中key的最大值
dict1 = {'a': '11', 'c': '22', 'b': '33'}
print(max(dict1))
print(max(dict1.keys()))

获取字典中最大value对应的key值
dict1 = {'a': '11', 'c': '22', 'b': '33'}
print(max(dict1, key=dict1.get))
print(max(dict1, key=lambda x: dict1[x]))

获取字典中最大value的值
dict1 = {'a': '11', 'c': '22', 'b': '33'}
print(max(dict1.values()))

获取句子中的最长单词
str3 = "Life is short , I use python"
print(str3.split())
print(max(str3.split(), key=len))

获取list中的最大值
list1 = ['11', 'zzz', '22', 'eee']
print(max(list1))

获取list中的最大数值
list2 = ['11', '3', '222', '67']
print(max(list2, key=lambda x: int(x)))

获取list中的绝对值最大的值
list3 = ['11', '-399', '222', '67']
print(max(list2, key=lambda x: abs(int(x))))

获取元组list中指定索引的最大值
list4 = [(1, 'a'), (3, 'c'), (4, 'e'), (-1, 'z')]
print(max(list4, key=lambda x: x[1]))

# 摘自:https://blog.csdn.net/u013250071/article/details/118220139

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OceanSec

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值