

题目不难,中等+评级3,不考察算法和数据结构,但是考察很多细节和思路。
自己踩的坑
自己一开始写的代码,没有注意到“垃圾车不用遍历所有的房子”,也就是说如果后面的房子都不在有某种垃圾了,则不用向后遍历了。
自己一开始是将后面所有的字符串相加,然后查找,结果超时了。
后面自己改正了思路,在开垃圾车前(?),先对字符串数据进行遍历。找到每种垃圾最后出现的位置,后面的房子就不用便利了。
代码如下:
class Solution:
def garbageCollection(self, garbage: List[str], travel: List[int]) -> int:
ans = 0
str_g = 'PGM'
n = len(garbage)
for g in str_g:
least = 0
for i in range(n):
if garbage[i].find(g) != -1:
least = i
for i in range(0,least+1):
now = garbage[i].find(g)
while now != -1:
ans += 1
# print('在',i,'收拾垃圾',g,',总耗时',ans)
garbage[i] = garbage[i][:now]+garbage[i][now+1:]
now = garbage[i].find(g)
if i != n-1 and i<least:
ans += travel[i]
# print('从',i,'去',i+1,'总耗时',ans)
return ans
大佬的思路一:多次遍历
看了灵山大佬的思路,只能说真的巧妙:

先让垃圾车跑满全程,再倒着遍历garbage,减去多跑的时间。
class Solution:
def garbageCollection(self, garbage: List[str], travel: List[int]) -> int:
ans = sum(map(len, garbage)) + sum(travel)*3
for c in 'MPG':
for g, t in zip(reversed(garbage), reversed(travel)):
if c in g:
break
ans -= t
return ans
几个学习到的技巧:
map
函数的用法:接受2个参数,第一项是函数,第二项是可迭代对象(如列表)。返回一个迭代器,包含每个元素应用函数后的结果。例如:def double(i): return 2*i l = [1,2,3,4,5] res = map(double, l) for i in res: print(i) #打印:2 4 6 8 10
作者这里通过
map(len,garbage)
,获得了garbage
每个字符串的长度,然后通过sum()
函数累加,得到了所有字符串的总长度。- 倒序遍历列表,可以直接使用
reverse(garbage)
,不用傻乎乎的通过range(n-1,-1,-1)
来遍历下标。 - 老生常谈的用
zip()
来同时遍历2个列表,自己老是记不住 判断字符串是否包含某子字符串,直接用
in
就好了。a = 'abcd' print('a' in a) # 打印: True print('aaa' in a) # 打印: False
《潜伏5:红门》恐怖片高清在线免费观看:https://www.jgz518.com/xingkong/36204.html
想想你的文章写的特别好www.jiwenlaw.com