我目前刷题最大的问题在于,简单的题目一般一分钟就有时间复杂度不错的思路了,但落实到代码上尝尝花费一个小时以上的时间,反复执行多次,经历多次的报错之后,才逐步完善。这就是之前代码一直流于纸面,喜欢写伪代码和思路却不落实到编程上的恶果。
我一开始的思路就是给list1做一个哈希表,即{餐馆名:数组下标};
然后定义一个res数组,储存具有最小索引和的餐馆。定义minIndex储存最小索引值
再遍历list2,如果list2中的餐厅与list1中餐厅名字相同,就将该索引和与最小索引和做比较。如果小于最小索引和,则清空res数组,再把该餐馆名储存到res中,再更新minIndex;如果等于最小索引和,则res.append当前餐馆
但很快我发现一个问题,那就是刚接触python的我不知道怎么定义哈希表,后来我才发现有字典这么个好东西。
运用字典后,执行出错。
class Solution:
def findRestaurant(self, list1: List[str], list2: List[str]) -> List[str]:
len1 = len(list1)
len2 = len(list2)
lenres = min(len1,len2)
res = [""]*lenres
minindex = 2000
mydict = {}
for i in range(0,len1):
mydict.update({list1[i]:i})
for j in range(0,len2):
if mydict[list2[j]]+j < minindex:
res.clear()
res.append(list2[j])
minindex = mydict[list2[j]]+j
elif mydict[list2[j]]+j == minindex:
res.append(list2[j])
return res
原来是因为,如果python的字典中没有当前的键,就会直接报错而不是返回false值。因此我使用了dict.get(key,default)函数,当字典中没有相应的key值会直接返回默认值,而不是报错。
最终代码:
class Solution:
def findRestaurant(self, list1: List[str], list2: List[str]) -> List[str]:
len1 = len(list1)
len2 = len(list2)
lenres = min(len1,len2)
res = [""]*lenres
minindex = 2000
mydict = {}
for i in range(0,len1):
mydict.update({list1[i]:i})
for j in range(0,len2):
if (mydict.get(list2[j],"none")!="none"):
if mydict[list2[j]]+j < minindex:
res.clear()
res.append(list2[j])
minindex = mydict[list2[j]]+j
elif mydict[list2[j]]+j == minindex:
res.append(list2[j])
return res