一道面试题的几种解法

最近接触到一道比较有意思的面试题,题目的解法很简单,我会列出几种解法。
题目的要求是读取一个文本文件,然后计算出其中的词频(也就是统计每个字符出现的次数)。
这道题可以分成两个部分:一部分是文件的操作,另一部分是对打开的文件进行统计。
读取文件的方法比较简单:
假定文件是‘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  # 如果已经有了,数量加一

最后:
作为一个初学者,我一直以来都习惯于去找一些所拥有的的知识能解决,但是需要用点脑子去解决的问题,但是往往对已经解决掉的麻烦直接抛之脑后。经过这次模拟面试以后,我才发现一个问题:其实需要解决的问题并不全是什么难题,而是要尽量用更有效的方法。在编程中体现的就是用最小的运算去解决一个问题。而好的方法往往来自于多次的实践和比较。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值