#python #algorithm #list
#python #алгоритм #Список
Вопрос:
v=[1,2,3,4,8,7,6,9]
В приведенном выше списке реверсирование 6,7,8 даст последовательные значения. Если я правильно понимаю, я думаю, что это то, что хочет найти эта проблема https://www.geeksforgeeks.org/check-reversing-sub-array-make-array-sorted /
Мой подход был
- Найдите списки перевернутых значений
- Найдите, какой из этих списков содержит последовательный номер.
Я не могу заставить step2 работать. Вот мой код:
v=[1,2,3,4,8,7,6,9]
ls=[]
# This part below will generate many lists and 1 of them will be [6,7,8]
for i in range (0,len(v)-1):
for j in range(i 1, len(v)):
r= v[i:j][::-1]
ls.append(r)# this append lists not values
#Below code will check to see if any list has consecutive values
for item in ls:
for i in range(len(item) - 1):
if item[i] 1 == item[i 1]:
if i == 0 or item[i] - 1 != item[i - 1]:
print(item)
Я получаю следующее, когда я ожидал [6,7,8]
[6, 7, 8, 4, 3]
[7, 8, 4]
[6, 7, 8, 4]
[7, 8]
[6, 7, 8]
Может кто-нибудь любезно дать мне подсказку? Правильно ли я интерпретировал исходный вопрос? Я не хотел использовать geek для ответа geek.
Комментарии:
1. В связанном вопросе нет требования, чтобы отсортированные значения были последовательными числами.
2. Я понимаю, что вы имеете в виду, когда я читаю «Перевернув подмассив {5, 4, 3}, массив будет отсортирован». Я предположил, что числа должны быть последовательными.
3. Хорошо, числа не обязательно должны быть последовательными. Кроме того, вы можете просто использовать 2 указателя, чтобы заставить это работать. Третье решение по ссылке должно сработать для вас.
Ответ №1:
Если вы ищете только одну подстроку для реверсирования, вы можете использовать zip() для сравнения последовательных пар значений. Сначала определите местоположение первой убывающей пары. Затем найдите местоположение первой возрастающей пары с этой точки. Если у вас есть допустимый диапазон, инвертируйте подстроку и проверьте, в порядке ли список.
a = [1,2,3,4,8,7,6,9]
start = next( (i for i,(v0,v1) in enumerate(zip(a,a[1:])) if v0>v1),len(a))
end = next( (i start 1 for i,(v0,v1) in enumerate(zip(a[start:],a[start 1:])) if v0<v1),len(a))
if end > start : a[start:end] = a[start:end][::-1]
canSort = end > start 1 and not any( a>b for a,b in zip(a,a[1:])) # True
Это будет обрабатываться за O (n) время, в отличие от O (n ^ 2) для вложенных циклов.
Если вы хотите проверить наличие нескольких инверсий подстрок, вам нужно будет превратить это в цикл.
Ответ №2:
Вы можете сделать что-то вроде этого … предполагая, что под последовательными числами вы подразумеваете числа, которые отличаются на одну единицу. Вы также можете изменить сценарий для размещения чисел в обратном порядке, но не в точном порядке (8 7 6) против (9 6 4)
v=[1,2,3,4,8,7,6,9]
l = []
last_item =-99
for i in range(1,len(v)-1):
if v[i] == v[i 1] 1:
l.append(v[i])
last_item = v[i]
elif v[i] == last_item - 1:
l.append(v[i])
last_item = v[i]
print(sorted(l))