程序:Python中查找列表,显示所有球移动到当前位置所需的总距离
假设我们有一个二进制列表称为 nums,其中只包含0和1,其中0表示空单元格,1表示单元格由球填充。我们必须找到一个新列表 L,其大小与 nums 大小相同,其中 L[i] 设置为将所有球移动到 L[i] 所需的总距离。这里从索引 j 到索引 i 移动球的距离是 |j – i|。
因此,如果输入为 nums = [1, 1, 0, 1],则输出将是 [4, 3, 4, 5],因为
- L[0] = |0 – 0| + |1 – 0| + |3 – 0|
- L[1] = |0 – 1| + |1 – 1| + |3 – 1|
- L[2] = |0 – 2| + |1 – 2| + |3 – 2|
- L[3] = |0 – 3| + |1 – 3| + |3 – 3|
因此,要将所有球移动到 L[1],必须将球从索引0移动到距离为1的位置1,将球从索引3移动到距离为2的位置1。
为了解决这个问题,我们将遵循以下步骤−
- 如果 nums 为空,则
- 返回新列表
- 将 left_count 设置为 0
- 将 right_count 设置为 0
- 将 left_sum 设置为 0
- 将 right_sum 设置为 0
- 将 result 设置为新列表
- 对于 nums 中的每个索引和值 num,执行以下操作:
- 如果 num 是非零的,则
- right_count 增加1
- right_sum 加上索引
- 如果 num 是非零的,则
- 对于 nums 中的每个索引和值 num,执行以下操作:
- 在 result 的末尾插入 (left_sum + right_sum)
- 如果 num 是非零的,则
- right_count减少1
- left_count增加1
- left_sum增加left_count
- right_sum减少right_count
- 返回 result
例子
更好地理解以下实现方法−
def solve(nums):
if not nums:
return []
left_count = right_count = 0
left_sum = right_sum = 0
result = []
for index, num in enumerate(nums):
if num:
right_count += 1
right_sum += index
for index, num in enumerate(nums):
result.append(left_sum + right_sum)
if num:
right_count -= 1
left_count += 1
left_sum += left_count
right_sum -= right_count
return result
nums = [1, 1, 0, 1]
print(solve(nums))
输入
[1, 1, 0, 1]
“`
输出
[4, 3, 4, 5]