-
Notifications
You must be signed in to change notification settings - Fork 0
/
final_nearest_zero.py
73 lines (59 loc) · 3.42 KB
/
final_nearest_zero.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# Улица, на которой хочет жить Тимофей, имеет длину n,
# то есть состоит из n одинаковых идущих подряд участков.
# На каждом участке либо уже построен дом, либо участок пустой.
# Тимофей ищет место для строительства своего дома.
# Он очень общителен и не хочет жить далеко от других людей,
# живущих на этой улице.
# Чтобы оптимально выбрать место для строительства,
# Тимофей хочет для каждого участка знать расстояние
# до ближайшего пустого участка.
# (Для пустого участка эта величина будет равна нулю –—
# расстояние до самого себя).
# Ваша задача –— помочь Тимофею посчитать искомые расстояния.
# Для этого у вас есть карта улицы.
# Дома в городе Тимофея нумеровались в том порядке, в котором строились,
# поэтому их номера на карте никак не упорядочены.
# Пустые участки обозначены нулями.
# Формат ввода
# В первой строке дана длина улицы —– n (1 ≤ n ≤ 106).
# В следующей строке записаны n целых неотрицательных чисел — номера домов
# и обозначения пустых участков на карте (нули).
# Гарантируется, что в последовательности есть хотя бы один ноль.
# Номера домов (положительные числа) уникальны и не превосходят 109.
# Формат вывода
# Для каждого из участков выведите расстояние до ближайшего нуля.
# Числа выводите в одну строку, разделяя их пробелами.
from typing import List
def nearest_zero(number_list: List[int]) -> List[int]:
"""
The function takes a list of numbers from 0 to 109,
where each number is a segment. The number 0 means a plot
without a house. And returns a list with the distance from
each House to the empty lot.
"""
number_plots = len(number_list)
result = [0] * number_plots
zero_indices = [i for i in range(number_plots) if number_list[i] == 0]
for i in range(zero_indices[0], number_plots):
if number_list[i] == 0:
result[i] = 0
else:
result[i] = result[i - 1] + 1
for i in range(zero_indices[-1], zero_indices[0], -1):
if number_list[i] == 0:
result[i] = 0
else:
result[i] = min(result[i], result[i + 1] + 1)
for i in range(zero_indices[0] - 1, -1, -1):
result[i] = result[i + 1] + 1
return result
def read_input() -> List[int]:
"""
This function reads data from standard input and
returns a list numbers.
"""
n = int(input())
return list(map(int, input().strip().split()))
if __name__ == '__main__':
number_list = read_input()
print(" ".join(map(str, nearest_zero(number_list))))