РЕДАКТИРОВАТЬ:
Мне любопытно, почему меня понижают.Решение @wim
охотно игнорирует ограничение в первоначальном вопросе «без составления нового списка».Единственный ответ состоял в том, чтобы временно изменить его на deque в странной попытке обойти это ограничение.В настоящее время это единственный ответ, который соответствует всем требованиям ОП (перечислены ниже как два отдельных комментария).
Печатать самые большие значения списка в том же порядке, не создавая новый список
Мне нужно напечатать верхние 3 в этом списке, например
В этом ответе предполагается, что число всегда равно трем для того, сколько верхних чисел вам нужно извлечь, в их оригиналепорядок.Если это так, то, похоже, ответом будет O(n)
время и O(1)
пространство.
def top_three(nums):
if len(nums) <= 3:
return nums
a = b = c = float('-inf')
dex_a = dex_b = dex_c = None
for i, num in enumerate(nums):
if num > a and num > b and num > c:
a, b, c = num, a, b
dex_a, dex_b, dex_c = i, dex_a, dex_b
elif num > b and num > c:
b, c = num, b
dex_b, dex_c = i, dex_b
elif num > c:
c = num
dex_c = i
if dex_a < dex_b < dex_c:
print(a, b, c)
elif dex_a < dex_c < dex_b:
print(a, c, b)
elif dex_b < dex_a < dex_c:
print(b, a, c)
elif dex_b < dex_c < dex_a:
print(b, c, a)
elif dex_c < dex_a < dex_b:
print(c, a, b)
elif dex_c < dex_b < dex_a:
print(c, b, a)
Тесты:
In[3]: top_three([9, 1, 2, 11, 8])
9 11 8
In[4]: top_three([9, 1, 2, 11, 8, 9])
9 11 9
In[5]: top_three([3, 3, 1, 0, 4, 3, 2, 5])
3 4 5