每日积累蓝桥杯省赛题--单词分析

蓝桥杯单词分析题——每日积累——解题心得
虽然单词分析题是蓝桥杯是11届c组的较简单的算法题,但是也需要考虑到时间复杂度,需要尽可能优化代码,降低复杂度,否则必定出错。
接下来是具体问题和我的解题思路:
【具体问题】
试题 历届试题 单词分析【第十一届】【省赛】【C组】
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。

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

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

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

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

样例输入
lanqiao
Data
样例输出
a
2
Data
样例输入
longlonglongistoolong
Data
样例输出
o
6
Data
评测用例规模与约定
对于所有的评测用例,输入的单词长度不超过 。
【解题思路】
初看此题感觉不难,我直接用两个for循环查询计数便直接实现了算法功能。代码如下:

str=input()
count=0 #中间变量,记录每一个重复单词出现的次数
count_max=0 #结果变量,记录最大重复次数单词的重复次数
s="" #中间变量,统计每一个单词次数时对应的单词
s_result=""#结果变量,记录最大重复次数的单词
for i in range(len(str)):
    for j in range(len(str)): #使用双层for循环在输入数组中查找相同单词
        if str[j]==str[i]: #如果查找到相同单词则计数,并且将该词交给中间变量s,便于接下来使用
            count+=1
            s=str[j]
    if count>count_max: #比较现在单词出现次数与前一个单词出现次数,如果现在次数大于上一次次数则赋值给最大次数
    #交换三部走
        tem=count
        count=count_max
        count_max=tem
      #将最大次数对应的单词赋值给结果变量s_result
        s_result=s
    #该循环最后记得将中间变量次数置为0,便于下一循环计数    
    count=0
#输出结果
print(s_result)
print(count_max)

该程序乍一看完美,你自己给出的案例完全能找出最大次数的单词和次数,但是时间复杂度为O(n2),在长字符串的处理效率中完败。所以我们不得不考虑更优化算法,降低时间复杂度。
这是本代码测试结果
在这里插入图片描述
所以接下来如何优化算法? 说实话,认真读题是关键中的关键,因为题目中已经给出了优化算法的捷径 ! 这门语言中的单词都是由小写英文字母组成!
所以,字母类型已经完全确认,我们只需要一个一个将输入字符串中的字符匹配26个小写英文字母,并且创建一个26长度的全0值int型列表,26个英文字母中的字母匹配到一次便在int型列表对应下标的值加1.输入字符串的字母全部遍历一次之后,26个英文字母对应的次数已经完全统计。接下来只需要遍历一次统计次数的数组,找到最大次数,利用最大次数的下标便可以直接在字母列表中查到该最大次数对应的下标。
时间复杂度成功优化到了O(n)!搜索题目中的提示十分重要!
优化代码如下

str1=input()
str2="abcdefghijklmnopqrstuvwxyz" #26字母列表
count=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0] #26字母表对应字母出现次数
for s in str1: #遍历输入列表
    if s in str2: #在26字母列表中检索该字母
        count[str2.index(s)]+=1 #次数表对应下表次数加1
max_count=0
for i in count: #第二步遍历次数列表,找到最大次数
    if i>max_count:
    #交换三步法,这是惯例
        tem=max_count
        max_count=i
        i=tem
#输出最大次数字母和最大次数
print(str2[count.index(max_count)])
print(max_count)

成功降低时间复杂度后,对超长字符串的处理能力大大加强!结果全部通过!测试结果如下
在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

吴澳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值