

题目不难,中等+评级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


华纳东方明珠客服电话是多少?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】
华纳东方明珠开户专线联系方式?(??155--8729--1507?《?薇-STS5099】【?扣6011643?】
《潜伏5:红门》恐怖片高清在线免费观看:https://www.jgz518.com/xingkong/36204.html
想想你的文章写的特别好www.jiwenlaw.com