Добавление и сразу же удаление элемента списка

265 просмотра
0
0 Комментариев

Как реализовать такой алгоритм: из списка находим max, добавляем в другой список, сразу же удаляем, потом находим min, так же добавляем в другой список и сразу удаляем. Постоянно выкидывает ошибку выхода за пределы массива ( делал через pop)


Добавить комментарий

2 Answers

Python Опубликовано 14.12.2018
0

функциональное решение:

In [200]: import math
In [201]: from itertools import zip_longest, chain
 
In [202]: l = sorted(a, reverse=True)
 
In [203]: b = [x
               for x in chain.from_iterable(zip_longest(l[:math.ceil(len(l)/2)],
                                                        l[::-1][:len(l)//2]))
               if x]
 
In [204]: b
Out[204]: [7, 6, 7, 6, 7]

если совсем «в лоб»:

In [169]: a = [6,6,7,7,7];
 
In [170]: l = sorted(a, reverse=True)
     ...: b = []
     ...: while l:
     ...:     b.append(l.pop(0))
     ...:     if l:
     ...:         b.append(l.pop(len(l)-1))
     ...:
 
In [171]: b
Out[171]: [7, 6, 7, 6, 7]

Добавить комментарий
0

O(n log n) по времени, O(n) в памяти алгоритм:

from math import ceil
 
a = [2, 3, 1, 5, 4]
a.sort(reverse=True)
middle = ceil(len(a) / 2)
a[::2], a[1::2] = a[:middle], a[middle:][::-1]
print(a)  # -> [5, 1, 4, 2, 3]

O(n log n) по времени, O(1) в памяти алгоритм:

from collections import deque
 
a = [2, 3, 1, 5, 4]
a.sort()
q = deque()
while a:
    q.append(a.pop())
 
while q:
    a.append(q.popleft())
    if q:
        a.append(q.pop())
print(a)  # -> [5, 1, 4, 2, 3]

O(n**2) по времени, O(1) в памяти алгоритм:

a = [2, 3, 1, 5, 4]
b = []
odd = False
while a:
    b.append(a.pop((min if odd else max)(range(len(a)), key=a.__getitem__)))
    odd = not odd
print(b)  # -> [5, 1, 4, 2, 3]

Добавить комментарий
Напишите свой ответ на данный вопрос.
Scroll Up