Python 面试题
1. 给定一个数组和两个字符串,从数组找出两个字符串的最小间距。如:['123','abc','we','qwe','123']中,‘123’和‘abc’的最小距离是1,‘123’和‘456’(不存在)是0。
1 class Solution: 2 def minDistance(self, strs, str1, str2): 3 # write code here 4 str1_list = [] 5 str2_list = [] 6 min = 0 7 for num, content in enumerate(strs): 8 if str1 in content: 9 str1_list.append(num) 10 elif str2 in content: 11 str2_list.append(num) 12 if len(str1_list) == 0 or len(str2_list) == 0: 13 return -1 14 else: 15 for i in str1_list: 16 for j in str2_list: 17 a = abs(i - j) 18 if min == 0 or a < min: 19 min = a 20 return min 21 22 23 sol = Solution() 24 strs = ["QWER", "1234", "qwe", "666", "QWER","QWER","666"] 25 str1 = "QWER" 26 str2 = "666" 27 res = sol.minDistance(strs, str1, str2) 28 print(res)
以上 case 通过率为 80%,自查出现的问题:(当时面试官说 abs() 函数求绝对值在极限情况下会有问题,目前还不知道什么问题)
- 字符串为两个相同的值时,返回是 -1
- 当前的写法,如果要查找的是 12 和 666 的距离,会返回 2,期望是 -1
基于以上的问题,修改为:(修改的内容为 8-12 行)
1 class Solution: 2 def minDistance(self, strs, str1, str2): 3 # write code here 4 str1_list = [] 5 str2_list = [] 6 min = 0 7 for num, content in enumerate(strs): 8 if str1 == content and str1 == str2: 9 return 0 10 elif str1 == content: 11 str1_list.append(num) 12 elif str2 == content: 13 str2_list.append(num) 14 if len(str1_list) == 0 or len(str2_list) == 0: 15 return -1 16 else: 17 for i in str1_list: 18 for j in str2_list: 19 a = abs(i - j) 20 if min == 0 or a < min: 21 min = a 22 return min
2. 从一个文档中读取单词,单词每行一个,统计出现频率为前 10 的单词和出现次数。
1 def CountWords(filename): 2 all_words = {} 3 with open(filename,'r',encoding='utf-8') as fr: 4 for line in fr.readlines(): 5 word = line.strip() 6 if word in all_words.keys(): 7 all_words[word] += 1 8 else: 9 all_words[word] = 1 10 11 res_words = sorted(all_words.items(),key=lambda x:x[1],reverse=True)[:10] 12 # res_words = [x[0] for x in res_words] # 只返回单词时加上这句 13 return res_words
遇到的问题:sorted 函数不会用、匿名函数不熟练