1042 字符统计 (20 分)

题意描述:

请编写程序,找出一段给定文字中出现最频繁的那个英文字母。

输入格式:
输入在一行中给出一个长度不超过 1000 的字符串。字符串由 ASCII 码表中任意可见字符及空格组成,至少包含 1 个英文字母,以回车结束(回车不算在内)。

输出格式:
在一行中输出出现频率最高的那个英文字母及其出现次数,其间以空格分隔。如果有并列,则输出按字母序最小的那个字母。统计时不区分大小写,输出小写字母。

输入样例:
This is a simple TEST. There ARE numbers and other symbols 1&2&3…
输出样例:
e 7


解题思路:

Alice: 这道题,(^o ^)/~,简直小菜一碟。
Bob: 你倒是说说怎么做啊。
Alice: 好做,先把所有字母都变成小写的,这个可以用字符串的lower( )函数。然后建立由小写字母到出现的次数的映射,可以用字典。最后遍历一下,用打擂台算法找到出现次数的最大值和对应的小写字母就好了。
Bob: 恩呐,我也是这样想的。还有一点,如果有并列最大,你怎么找到字母序最小的那个呢?
Alice: 按照字母序去遍历不就好了,就是先看‘a’的次数,再看‘b’的次数。。。只要是 仅仅 > 当前最大值的时候才更新就行了。
Bob:用字典建立映射的话,按字母序遍历好像不太好实现啊。因为字典里字母出现的顺序是按照题目给出的字符串中字母出现的顺序建立的。比如说,输入是‘zzaa’ 字典可能是{‘z’: 2, 'a': 2}, 直接遍历的话就会出错的额。
Alice: 有点晕。。。(¦ 3 」∠)
Bob: 就是直接遍历字典的话,不一定是按照我们想要的 字母序去遍历的。因为字典建立的时候是按照题目中给出的字符串中的字母出现的先后顺序的。
Alice: 我明白了。啊,那这样用字典就要额外再写代码去保证按照字母序遍历了,这样用字典就显得不够优雅了。
Bob: 用列表啊。
Alice: 哈哈哈,我也想到了, 要用到ord( )chr( )
Bob:(* ^▽ ^*)


代码:

def main():
    string = input().lower()
    # 接收输入的字符串并且把其中的大写字母变成小写。如"L OV IEu" -> "l ov ieu"
    count = [0 for x in range(26)]
    # 计数器,用来记录a-z各个字母出现的次数。
    # 或者说建立一个有a-z到下标0-25的映射,再由下标映射到各个字符出现的次数。
    for x in string:
        if ord(x) >= ord('a') and ord(x) <= ord('z'):
            # 如果这是一个小写英文字母
            count[ord(x) - ord('a')] += 1
            # 这个字母出现的次数加一
    maxx = 0
    # 出现次数最多的英文字母出现的次数
    answer = ''
    # 出现次数最多的英文字母
    for x in range(len(count)):
        if count[x] > maxx:
            # 请注意这里的更新条件,只有 > 时才更新而不是 >= 时更新。
            # 这样就保证了如果有并列,则输出按字母序最小的那个字母。
            maxx = count[x]
            answer = chr(97 + x)
            # 由下标到 小写字母的映射,其中ord('a') == 97, ord('b') == 98...
    print(answer, maxx)
    # 输出答案, print()函数会将answer和maxx之间的逗号替换为空格。


if __name__ == '__main__':
    main()


易错点:

  • 找不到。。。(⊙o⊙)…

总结:


加油呀


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值