Статья Автор: Лебедев Дмитрий

TUZ_3-09 Первый объект, предшествующий k меньшим объектам

TUZ_3-09 Первый объект, предшествующий k меньшим объектам

TUZ_3-09 Первый объект, предшествующий k меньшим объектам
3.9. Первый объект, предшествующий k меньшим объектам
В этой задаче дается список объектов, и вы должны найти и вернуть объект,
которому предшествует как минимум k меньших объектов.
Если такого элемента нет, то функция должна вернуть значение None.
Например, рассмотрим items = [2, 1, 9, 14] и k = 2. Какому числу предшествуют как минимум k меньших чисел?
  • Так как числу 9 предшествуют числа 1 и 2, то 9 является ответом.
Если items = [4, 2, 1, 9, 14] и k = 2, то ответ снова равен 9,
  • поскольку по условию задачи искомому числу должно предшествовать не меньше k меньших чисел.
В качестве другого примера рассмотрим массив строк: items = [«cobol», «ruby», «c++», «python», «c++», «php»] и k = 2.
Какой строке предшествуют хотя бы k меньших строк?
  • Для начала нужно определить длины строк, а затем выполнить те же операции, что и в предыдущем примере.
    Ответом на вопрос во этом примере будет строка «python», так как она больше чем строки «c++», «cobol», 
    хотя и больше «ruby».
В табл. 3.9 показаны ожидаемые результаты для некоторых входных данных.
Таблица 3.9. Некоторые ожидаемые результаты для задачи поиска первого объекта, предшествующего k меньшим объектам
Items, k Ожидаемый результат 
[4,2, 1, 9, 14], 3 9
[2, 3, 4, 871], 4 None
[700, 3, 900, 400, 1100], 2 900
['cobol','ruby','c++','python','c','php'], 2 'python'
['cobol','ruby','c++','python','c','php'], 3 'php'

Алгоритм
Алгоритм просматривает каждый элемент в списке items и проверяет, имеются ли перед ним хотя бы k меньших элементов.
Для этого алгоритм создает подсписок всех элементов перед текущим элементом, которые меньше его.
Это делается с использованием генератора списков. После создания подсписка его длина сравнивается с k.
Если длина больше или равна k, то алгоритм возвращает текущий элемент как первый в списке,
которому предшествует не менее k меньших элементов.
Если такого элемента не существует, то алгоритм возвращает None.

В листинге 3.9 приводится код на Python, отыскивающий первый объект, которому предшествует не менее k меньших объектов.
Листинг 3.9. Поиск первого объекта, которому предшествует не менее k меньших объектов
1 def first_preceded_by_k_smaller_number(items, k=1):
2     '''
3     Цикл по элементам в списке items
4     и их индексам.
5     '''
6     for i, current_number in enumerate(items):
7
8         '''
9         Создать список элементов слева от текущего,
10         которые меньше его.
11         '''
12         smaller_numbers = \
13             [n for n in items[:i] if n < current_number]
14
15         '''
16         Если имеется не меньше k меньших элементов,
17         предшествующих текущему, то вернуть текущий элемент.
18         '''
19         if len(smaller_numbers) >= k:
20             return current_number 21
22     '''
23     Если нет элемента, удовлетворяющего
24     условиям, то вернуть None.
25     '''
26     return None


Пропустить Навигационные Ссылки.
Чтобы оставить комментарий нужна авторизация
Печать