Хотя проблема заключается в повороте влево (как вы говорите против часовой стрелки), мы всегда можем переформулировать его как поворот на заданное (положительное) смещение вправо.
Например, учитывая следующий массив (который должен быть std::vector
, в C ++) размера n = 9
1 2 3 4 5 6 7 8 9
Поворот влево от 3 мест ( d *) 1010 * = 3, в задаче ОП), эквивалентен повороту справа от 6 мест (назовем это смещение k , так что k = 6):
4 5 6 7 8 9 1 2 3
Если вы можете использовать дополнительную память, самый простой способ - скопировать первые n - k элементов (или последние k элементов) во временный буфер, переместите остальные k в начале (или первые n - k в конце), а затем скопируйте элементы из буфера обратно в последние позиции (или, вы знаете, ..).
[1 2 3 4 5 6 7 8 9] [ ]
^ ^ ^ Copy the first elements
[1 2 3 4 5 6 7 8 9] [1 2 3]
^ ^ ^ ^ ^ ^ Move to the beginning
[4 5 6 7 8 9 7 8 9] [1 2 3]
^ ^ ^ Copy back
[4 5 6 7 8 9 1 2 3] [1 2 3]
Если вы не можете это сделать, и для назначения требуется изменить массив на месте, хорошая альтернатива алгоритму жонглирования Орифим, показанный в других ответах, требует только трех обратных:
[1 2 3 4 5 6 7 8 9]
^ ^ ^ Reverse the first n - k elements
[3 2 1 4 5 6 7 8 9]
^ ^ ^ ^ ^ ^ Reverse the last k elements
[3 2 1 9 8 7 6 5 4]
^ ^ ^ ^ ^ ^ ^ ^ ^ Reverse all
[4 5 6 7 8 9 1 2 3]
Если вы пишете реальный код, вам лучше использовать std :: rotate .