题目描述
来源
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’
’ ’
解题思路
- 利用字符串和数字k之间的空格,分割得出字符串sentence和数字k。
- 调用函数find_m_occurrences(k, sentence),得到在字符串sentence内出现k次的字符,返回这些字符组成的列表,存入chars。
- 按字典序对chars进行排序,而后按要求的格式输出chars内的各个字符。
- 如何找出字符串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()
测试用例
-
题目描述给出的测试用例覆盖了一般情形。第一组测试数据中,找出多个字符,按字典序输出。第二组测试数据中,空格成为输出内容。
-
没有字符出现k次的情形。
样例输入
1
abc 3
样例输出
(注:无输出!) -
n=1的边界情形。查找结果只有1个字符。
样例输入
1
aaa 3
样例输出
‘a’
小结
- Python编程中,查找出现k次…这类的问题,适合用字典来统计出现次数。
- 字典内的键值对是无序的。要排序,先转换成列表。