题目描述
给定一个升序的时间数组timeSeries,为Teemo发起攻击的时间;一个整数为一次攻击能够产生影响的时间长度duration;最后给出总共的影响时间。
分析(笨方法)
(1)若下次攻击时间到达时,上一次攻击的影响已结束,则可以直接加上duration;
(2)若下次攻击时间到达时,上一次攻击的影响未结束,则只加上被影响的时间长度,继续下一次攻击。
答案
class Solution(object):
def findPoisonedDuration(self, timeSeries, duration):
"""
:type timeSeries: List[int]
:type duration: int
:rtype: int
"""
ans=0
n=len(timeSeries)
if n==0:
return ans
for i in xrange(1,n):
if timeSeries[i]-timeSeries[i-1]>=duration:
ans+=duration
else:
ans+=timeSeries[i]-timeSeries[i-1]
ans+=duration
return ans
一行代码解决
return sum(min(duration,this_time-last_time))
该代码需要从timeSeries数组中一次性取出两个元素,使用zip()方法可以实现。
zip(a,b) 函数可以将可迭代对象类型的参数a和b中的元素,按照对应位置,两两打包成一个个元组之后返回。若a, b的元素个数不一致,该函数返回的元组数目与元素个数较少的迭代对象所含元素数目一致。所以,此处给timeSeries[1:]中添加一个元素[10e7]表示十的七次方,可以保证最后一个元素对应的 this_time-last_time>>duration ,即返回的结果中包含最后一次攻击持续的时间。
this_time, last_time for this_time, last_time in zip(timeSeries, timeSeries[1:]+[10e7])
最终答案为
return sum(min(duration,this_time-last_time) for last_time, this_time in zip(tS, tS[1:]+[10e7]))