Python入门习题(75)——OpenJudge百练习题:查找出现了k次的字符

OpenJudge百练第4071号习题:查找出现了k次的字符

题目描述

来源
OpenJudge网站百练习题集-第4071号习题

要求
总时间限制: 1000ms 内存限制: 65536kB

描述
给定一个ASCII字符串,查找字符串中,出现了k次的字符。比如,字符串"This is a good day!"中,出现了2次的字符为’a’,‘d’,‘i’,‘o’, ‘s’,出现了4次的字符为’ '。

输入
第一行是一个正整数n(1<=n<=100),表示下面要进行查找的字符串的数量。其后n行,每行是一个字符串(这里确保字符串的结尾不是空格),和一个数字k,字符串和数字k之间由一个空格隔开。
输出
输出要求按照ASCII码从小到大的顺序输出字符,每个字符用单引号括起来,字符间用逗号隔开。
样例输入
2
This is a good day! 2
This is a good day! 4
样例输出
‘a’,‘d’,‘i’,‘o’,‘s’
’ ’

解题思路

  1. 利用字符串和数字k之间的空格,分割得出字符串sentence和数字k。
  2. 调用函数find_m_occurrences(k, sentence),得到在字符串sentence内出现k次的字符,返回这些字符组成的列表,存入chars。
  3. 按字典序对chars进行排序,而后按要求的格式输出chars内的各个字符。
  4. 如何找出字符串sentence内出现k次的字符?做法是,用字典存储字符及其出现次数。从左到右扫描sentence内的字符s,如果s在字典里,那么出现次数增1,否则出现次数设为1。最后,扫描字典,取出出现次数为k的字符。

参考答案

n = int(input())
#在字符串sentence中找出出现m次的字符,返回这些字符组成的列表
def find_m_occurrences(m, sentence):
    o_dict = { }
    for s in sentence:
        if s in o_dict:
            o_dict[s] += 1
        else:
            o_dict[s] = 1

    chars = []
    for s in o_dict:
        if o_dict[s] == m:
            chars.append(s)

    return chars


for i in range(n):
    line = input().rstrip()  #万一尾部有多于空格
    d_start = line.rfind(' ')  #找到数字前的空格的索引
    count = int(line[d_start:])  #查找出现count次的字符
    sentence = line[:d_start]  #被查找的字符串
    chars = find_m_occurrences(count, sentence)
    if len(chars) > 0:
        chars.sort()
        print("'"+chars[0]+"'", end='')
        for c in chars[1:]:
            print(",'"+ c +"'", end='')
        print()
    else:
        print()

测试用例

  1. 题目描述给出的测试用例覆盖了一般情形。第一组测试数据中,找出多个字符,按字典序输出。第二组测试数据中,空格成为输出内容。

  2. 没有字符出现k次的情形。
    样例输入
    1
    abc 3
    样例输出
    (注:无输出!)

  3. n=1的边界情形。查找结果只有1个字符。
    样例输入
    1
    aaa 3
    样例输出
    ‘a’

小结

  1. Python编程中,查找出现k次…这类的问题,适合用字典来统计出现次数。
  2. 字典内的键值对是无序的。要排序,先转换成列表。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值