需求
最近在看工作机会, 然后做了一道华为外包的笔试题.
1. 输入: "eaaabbccccddderrfc"
2. 要求:
2.1 按字母出现次数降序排列输出, 如果次数相同,则按自然顺序排序
2.2 不能用Python 内置的排序函数
输出: c:5;a:3;d:3;b:2;e:2;r:2;f:1;
我咋眼一看, 这种送分题, 能难住我?
- 构造一个字典, 统计词频
- sorted() 按值排序即可
求解
用内置函数sorted()
my_str = "eaaabbccccddderrfc"
# 统计词频
d = {}
for s in my_str:
if d.get(s):
d[s] += 1
else:
d[s] = 1
# 字典按值排序, sorted()
sorted(d.items(), key=lambda arr: arr[1], reverse=True)
[('c', 5), ('a', 3), ('d', 3), ('e', 2), ('b', 2), ('r', 2), ('f', 1)]
正准备提交, 才发现, 不能用内置, 要自己写排序, 这一下, 难度立马升级了
- 短时间内要写出排序算法
- 数据要如何组织
本来想写个快排, 结果那一刻, 竟然写不出来, 果然平时练习和真正测试,不刷题真的搞不定, 还好会写个冒泡, 差点就凉凉了.
'''
1. 输入: "eaaabbccccddderrfc"
2. 要求:
2.1 按字母出现次数降序排列输出, 如果次数相同,则按自然顺序排序
2.2 不能用Python 内置的排序函数
输出: c:5;a:3;d:3;b:2;e:2;r:2;f:1;
'''
# 词频统计
def word_count(my_str):
"""输入一个字符串, 统计每个字母的频率"""
d = {}
for s in my_str:
if d.get(s):
d[s] += 1
else:
d[s] = 1
return d
def my_sort(lst):
"""输入一个数组, 按降序排列"""
n = len(lst)
if n == 1:
return lst
for i in range(n):
for j in range(n - 1 - i):
if lst[j] < lst[j + 1]:
# 交换顺序
lst[j], lst[j + 1] = lst[j + 1], lst[j]
return lst
if __name__ == '__main__':
my_str = "eaaabbccccddderrfc"
d = word_count(my_str)
desc_keys = my_sort(list(d.values()))
lst_ret = []
for i in desc_keys:
for k, v in d.items():
if i == v:
lst_ret.append((k, v))
d.pop(k)
break
# 输出效果
for s in lst_ret:
print(f"{s[0]}:{s[1]}", end=";")
c:5;a:3;d:3;e:2;b:2;r:2;f:1;
平时多积累, 唯手熟尔呀, 不过好像还是没有做到按自然顺序排列哦.