Я нуждаюсь в вашей помощи. Можете ли вы помочь мне разобраться в ошибках, которые я сделал при решении задачи VK EDUCATION?

Перефразированный вопрос:

Каким образом можно улучшить предложенное решение для задачи подсчета количества элементов, отличных от заданного числа, и удаления всех вхождений этого числа из входного массива?
  • 7 ноября 2023 г. 12:28
Ответы на вопрос 2
Конечно, я могу помочь вам разобраться в ошибках и предложить улучшенное решение задачи.

Для начала, покажите мне ваше изначальное решение и объясните, какие проблемы вы столкнулись при его выполнении или какие ошибки допустили. Это поможет мне лучше понять проблему и дать вам наиболее подходящую помощь.
Ваше решение технически верное, но есть два недостатка, особенно при работе с большими массивами и/или частыми операциями. 
Во-первых, вы создаете копию массива для итерации (arr[::-1]), что занимает столько же памяти, сколько оригинальный массив. 
Во-вторых, вы удаляете элементы из массива по значению (remove), а не по индексу (del), что замедляет выполнение. 
Рекомендую ознакомиться с тем, как массив устроен внутри и понять временную сложность операций добавления, вставки, изменения и удаления элементов. Это поможет понять, почему одновременная итерация в прямом порядке с помощью цикла for и удаление элементов из массива - плохая идея. 
Ниже представлены 4 функции с бенчмарками, включая вашу:


import random
import time


def func(arr, el):
    for i in arr[::-1]:
        if i == el:
            arr.remove(el)
    return len(arr)


def remove_reverse(arr, el):
    for i in reversed(arr):
        if i == el:
            arr.remove(el)
    return len(arr)


def del_by_index_reverse(arr, el):
    for i in reversed(range(len(arr))):
        if arr[i] == el:
            del arr[i]
    return len(arr)


def del_by_index_while(arr, el):
    i = 0
    while i < len(arr):
        if arr[i] == el:
            del arr[i]
        else:
            i += 1
    return len(arr)


arr1 = [random.randint(0, 9) for num in range(100_000)]
arr2 = arr1[:]
arr3 = arr1[:]
arr4 = arr1[:]
el = 5

start = time.perf_counter()
print(func(arr1, el))
print(time.perf_counter() - start)

start = time.perf_counter()
print(remove_reverse(arr2, el))
print(time.perf_counter() - start)

start = time.perf_counter()
print(del_by_index_reverse(arr3, el))
print(time.perf_counter() - start)

start = time.perf_counter()
print(del_by_index_while(arr4, el))
print(time.perf_counter() - start)
Похожие вопросы