最近接触到一道比较有意思的面试题,题目的解法很简单,我会列出几种解法。
题目的要求是读取一个文本文件,然后计算出其中的词频(也就是统计每个字符出现的次数)。
这道题可以分成两个部分:一部分是文件的操作,另一部分是对打开的文件进行统计。
读取文件的方法比较简单:
假定文件是‘d:\New\test.txt’
方法一:
text = open('d:\\New\\test.txt','r') # 在这里我们只需要读取就行了,所以用只读模式打开。
text_read = text.read()
# 统计操作
text.close()
方法二:
with open('d:\\New\\test.txt','r') as text:
text_read = text.read()
# 统计操作
第二部分我马上想到的是用集合的自动去重:
text_set = { char for char in text_read } # 一个简单的集合推导式。
for i in text_set:
count = 0
for j in text_read:
if i == j:
count += 1
print('{}出现了{}次'.format(i,count)
正在我还在想这里面还有没有哪些细节有bug的时候,面试的老师告诉我,你这个解法确实能做出来,不过你再想想还有没有更好的办法。
出于惯性思维,我想了一下,如果把集合里的元素做为字典的键,而将文本里的字符计数作为值:
text_dict = {}
for i in text_set:
text_dict[i] = text_read.count(i)
当我在纠结中得意的时候,老师给了我一个鄙视而又不失礼貌的微笑。大概也是没多少耐心了,提点了一下:既然你都用字典了,还用集合干嘛?
然后我一拍脑门,如果是入职的面试的话,我基本上就要‘回去等通知’了。
当然,我也反应过来了:
text_dict = {}
for each in text_read:
if not (each in text_dict):
text_dict[each] = 1 # 如果第一次出现,添加键值对
else:
text_dict[each] += 1 # 如果已经有了,数量加一
最后:
作为一个初学者,我一直以来都习惯于去找一些所拥有的的知识能解决,但是需要用点脑子去解决的问题,但是往往对已经解决掉的麻烦直接抛之脑后。经过这次模拟面试以后,我才发现一个问题:其实需要解决的问题并不全是什么难题,而是要尽量用更有效的方法。在编程中体现的就是用最小的运算去解决一个问题。而好的方法往往来自于多次的实践和比较。