Ответ 1
Вы можете прокручивать массив и проверять, что все значения увеличиваются. И как только вы нажмете первое значение, которое не увеличивается, убедитесь, что он и все следующие значения увеличиваются И меньше или равны первому элементу массива.
Edit:
Я чувствую, что люди отказываются от решения Дэниела, потому что они не понимают его или не думают, что он сломан. Это печально, потому что я думаю, что его решение блестяще.
def is_circular_sorted(arr):
count = 0
length = len(arr)
for i in range(length):
if arr[i] > arr[(i+1) % len(arr)]:
count += 1
return count <= 1
In [4]: is_circular_sorted([1, 2, 3, 4])
Out[4]: True
In [5]: is_circular_sorted([1, 1, 1, 1])
Out[5]: True
In [6]: is_circular_sorted([1, 3, 4, 7, -9])
Out[6]: True
In [7]: is_circular_sorted([1, 3, 4, 2])
Out[7]: False
Немного объясним. Чтобы проверить, отсортирован ли список по кругу, мой первоначальный ответ сказал, что вам нужно проверить, был ли один или менее "разрыв" от полного сортировки. И все числа после "перерыва" были меньше первого числа в массиве.
Однако, как показывает ответ Дэниела, вам не нужно проверять ВСЕ числа после "перерыва", только последнее число (что также является самым большим/максимальным числом после перерыва, потому что они отсортированы).
Всегда должен быть один разрыв, если только список не заполняется теми же номерами, в этом случае не было бы разрывов, а число будет равно 0.