Пройдіться зліва направо, використовуючи стек, щоб відстежувати, який колір ви маєте. Замість дискретної карти використовуйте 10 чисел у вашому наборі даних як точки перерви.
Починаючи з порожнього стека і встановлюючи start
0, циклічно, поки не досягнемо кінця:
- Якщо стек порожній:
- Шукайте перший колір, починаючи з або після
start
, і натискайте його та всі кольори нижчого рівня на стек. У своєму сплющеному списку позначте початок цього кольору.
- інше (якщо не порожнє):
- Знайдіть наступну початкову точку для будь-якого вищого рейтингу кольору під час або після
start
і знайдіть кінець поточного кольору
- Якщо наступний колір починається першим, натисніть його та все інше на шляху до нього на стек. Оновіть кінець поточного кольору як початок цього і додайте початок цього кольору до сплющеного списку.
- Якщо таких немає, а поточний колір закінчується спочатку, встановіть
start
його в кінці цього кольору, виведіть його із стека та перевірте наступний найвищий колір
- Якщо
start
знаходиться в діапазоні наступного кольору, додайте цей колір до розрівняного списку, починаючи з start
.
- Якщо стек порожній, просто продовжуйте цикл (поверніться до першої точки кулі).
Це розумовий результат, враховуючи ваші приклади даних:
# Initial data.
flattened = []
stack = []
start = 0
# Stack is empty. Look for the next starting point at 0 or later: "b", 0 - Push it and all lower levels onto stack
flattened = [ (b, 0, ?) ]
stack = [ r, b ]
start = 0
# End of "b" is 5.4, next higher-colored start is "g" at 2 - Delimit and continue
flattened = [ (b, 0, 2), (g, 2, ?) ]
stack = [ r, b, g ]
start = 2
# End of "g" is 12, next higher-colored start is "y" at 3.5 - Delimit and continue
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, ?) ]
stack = [ r, b, g, y ]
start = 3.5
# End of "y" is 6.7, next higher-colored start is "o" at 6.7 - Delimit and continue
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, ?) ]
stack = [ r, b, g, y, o ]
start = 6.7
# End of "o" is 10, and there is nothing starting at 12 or later in a higher color. Next off stack, "y", has already ended. Next off stack, "g", has not ended. Delimit and continue.
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, ?) ]
stack = [ r, b, g ]
start = 10
# End of "g" is 12, there is nothing starting at 12 or later in a higher color. Next off stack, "b", is out of range (already ended). Next off stack, "r", is out of range (not started). Mark end of current color:
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, 12) ]
stack = []
start = 12
# Stack is empty. Look for the next starting point at 12 or later: "r", 12.5 - Push onto stack
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, 12), (r, 12.5, ?) ]
stack = [ r ]
start = 12
# End of "r" is 13.8, and there is nothing starting at 12 or higher in a higher color. Mark end and pop off stack.
flattened = [ (b, 0, 2), (g, 2, 3.5), (y, 3.5, 6.7), (o, 6.7, 10), (g, 10, 12), (r, 12.5, 13.8) ]
stack = []
start = 13.8
# Stack is empty and nothing is past 13.8 - We're done.