在Python中编写一个计算走过k次的块数的程序
假设我们有两个名为walks
和target
的列表。一开始,我们在一维线条的位置0上。 | walks [i] |
表示已经走的步数。 当walk [i]
为正数时,表示向右走,为负数时表示向左走。当我们走路时,我们移动一个块,即下一个或前一个整数位置。我们必须找出被走过至少target
次的块的数量。
因此,如果输入如下:walks = [3,-7,2]
target = 2
,则输出将是5。从下面的图中,我们可以看到[0,1]
,[1,2]
,[2,3]
,[-4,-3]
,[-3,-2]
均被走过了2次。
为了解决这个问题,我们将采取以下步骤-
- pos:= 0
- jumps:=哈希图中的默认值为0
- 对于走过的每个距离,执行以下操作:
- 如果距离“> 0”,则 jumps [pos]:= jumps [pos] +1,否则始终减去1
- 如果距离“> 0”,则 jumps [pos + dist]:= jumps [pos + dist] -1,否则始终减去1
- pos:= pos + dist
- lastpos:= 0
- level:= 0
- total:= 0
- 对于跳跃的排序的键值对中的每个位置pos和值val,执行以下操作:
- 如果级别≥目标,则
- total:=total + pos-lastpos
- 级别:=level + val
- lastpos:= pos
- 如果级别≥目标,则
- 返回总数
示例
请参阅以下实现,以获得更好的理解−
from collections import defaultdict
def solve(walks, target):
pos = 0
jumps = defaultdict(int)
for dist in walks:
jumps[pos] += 1 if dist > 0 else -1
jumps[pos + dist] -= 1 if dist > 0 else -1
pos += dist
lastpos = level = total = 0
for pos, val in sorted(jumps.items()):
if level >= target:
total += pos - lastpos
level += val
lastpos = pos
return total
walks = [3, -7, 2]
target = 2
print(solve(walks, target))
输入
[3, -7, 2],2
输出
5