Python Livecode

Задача 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

Написать класс

  1. с параметрами: n, lower_bound, upper_bound (целые числа)
  2. метод init генерирует список случайных чисел длины n от lower_bound до upper_bound
  3. строковым представлением объекта класса должен быть сгенерированный список
  4. у класса должны быть методы-свойства, возвращающие математическое ожидание и дисперсию списка
  5. у класса должен быть метод, возвращающий длину наибольшей монотонно возрастающей непрерывной подпоследовательности элементов списка
  6. у класса должен быть метод, вычисляющий разность между вторым наибольшим и вторым наименьшим элементами списка (допустим, что дублей нет)
  7. у класса должен быть метод, принимающий на вход параметр 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