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]被覆盖了k = 2次。
为了解决这个问题,我们将遵循以下步骤:
- pos := 0
- jumps := 一个哈希映射,当键不存在时,默认值为0
- 对于walks中的每个dist,执行:
- 如果dist > 0,则jumps[pos] := jumps[pos] + 1,否则jumps[pos] := jumps[pos] -1
- 如果dist > 0,则jumps[pos + dist] := jumps[pos + dist] - 1,否则jumps[pos + dist] := jumps[pos + dist] + 1
- pos := pos + dist
- lastpos := 0
- level := 0
- total := 0
- 对于jumps排序后的键值对中的每个位置pos和值val,执行:
- 如果level >= target,则
- total := total + pos - lastpos
- level := level + val
- lastpos := pos
- 如果level >= target,则
- 返回total
示例
让我们看下面的实现来更好地理解:
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
广告