Задача 1
Дан список целых чисел. Необходимо посчитать максимальную длину последовательности (не обязательно расположенных подрях в массиве), которую можно составить из чисел этого массива составляющих последовательность.с шагом 1.
Например:
вход [7, 5, 34, 2, 6, 3, 100, 4]
Ответ: 6. Потому что в этом массиве есть числа от 2 до 7 и их количество равно 6.Решено
def longest_subsequence(nums):
unique_nums = set(nums)
max_subsequence_len = 0
for num in nums:
if num - 1 not in unique_nums:
cur_num = num
subsequence_len = 1
while num + 1 in unique_nums:
cur_num += 1
subsequence_len += 1
max_subsequence_len = max(subsequence_len, max_subsequence_len)
return max_subsequence_lenЗадача 2
Кирилл пришёл в кинотеатр и хочет сесть на свободное место, но так, чтобы расстояние до ближайшего соседа было максимальным. Найдите это расстояние.
Дан массив из нулей и единиц, представляющий собой свободные и занятые места соответственно. Расстояние между соседними креслами равно 1. Хотя бы одно место занято, и хотя бы одно свободно.
Пример 1:
[0, 1, 0, 0, 1, 0] —> 1
Пример 2:
[0, 1, 0, 0, 0, 1] —> 2Решено
def get_free_seats(seats):
cur_place = 0
n_seats = len(seats)
max_free_seats = 0
while cur_place < n_seats:
while cur_place < n_seats and seats[cur_place] == 1:
cur_place += 1
next_taken_seat = cur_place
while next_taken_seat < n_seats and seats[cur_place] != 1:
next_taken_seat += 1
cur_free_seats = next_taken_seat - cur_place
if cur_place == 0 or next_taken_seat == n_seats:
max_free_seats = max(max_free_seats, cur_free_seats)
else:
max_free_seats = max(max_free_seats, cur_free_seats + 1 // 2)
cur_place = next_taken_seat
return max_free_seatsЗадача 3
Написать класс
- с параметрами: n, lower_bound, upper_bound (целые числа)
- метод init генерирует список случайных чисел длины n от lower_bound до upper_bound
- строковым представлением объекта класса должен быть сгенерированный список
- у класса должны быть методы-свойства, возвращающие математическое ожидание и дисперсию списка
- у класса должен быть метод, возвращающий длину наибольшей монотонно возрастающей непрерывной подпоследовательности элементов списка
- у класса должен быть метод, вычисляющий разность между вторым наибольшим и вторым наименьшим элементами списка (допустим, что дублей нет)
- у класса должен быть метод, принимающий на вход параметр k и возвращающий список k наиболее часто встречающихся элементов списка (в случае, если несколько элементов имеют одинаковую частоту, использовать логику функции dense_rank)
l = RandomList(n=7, lower_bound=0, upper_bound=100)
# generates list
l
# [22, 98, 51, 25, 46, 98, 66]
l.mean
# 58.0
l.max_sequence()
# 3
# Объяснение: [25, 46, 98]
l.most_frequent(k=1)
# [98]
l.most_frequent(k=2)
# [98, 22, 51, 46, 25, 66]Решено не полностью
import random import randint
class RandomList():
def __init__(self, n: int, lower_bound: int, upper_bound: int):
self.lst = [randint(lower_bound, upper_bound) for _ in range(n)]
def __str__(self):
return str(self.lst)
@property
def mean(self):
return self.lst / len(self.lst)
@property
def variance(self):
mean_value = self.mean()
return sum((num - mean_value)**2 for num in self.lst) / len(self.lst)
def max_sequence(self):
def second_max_min_diff(self):
sorted_list = sorted(self.lst)
if len(sorted_list) < 2:
raise ValueEror('Последовательность слишком короткая')
return sorted_list[-2] - sorted_list[1]
def most_frequent(self, k):
counter = {}
for el in self.lst:
counter[el] = counter.get(el, 0) + 1
sorted_counter = sorted(counter.items(), key=lambda item: item[1])
return res