Одним из наблюдений, которое может значительно облегчить решение этой проблемы, является следующее: Предположим, что у вас есть количество строк, равное 3, и вы хотите продолжать зигзагообразно разбивать строки, распределяя символы.Затем, если вы переберите четыре символа, вы добавите их в строки 1, 2, 3 и 2, прежде чем повторять этот шаблон.С числом строк пять вы бы посетили ряды 1, 2, 3, 4, 5, 4, 3 и 2, прежде чем повторять этот шаблон.В более общем случае, если у вас есть количество строк k, то набор строк для распределения символов следует шаблону 1, 2, 3, ..., k, k - 1, k - 2, ..., 2, который имеет длину 2k - 2.
Учитывая это наблюдение, вы можете сделать код намного чище, предварительно рассчитав таблицу, содержащую этот цикл, а также длину этого цикла.Когда у вас есть эта таблица, вы можете циклически переключаться между персонажами, отслеживать, на каком персонаже вы находитесь.Когда вы находитесь на n-м символе, вы должны индексировать таблицу в позиции n mod k, а затем распределять символ в эту строку.
В псевдокоде (с использованием индексов на основе единицы):
rowTable = new array of ints length 2k - 2
for i = 1 up to k:
rowTable[i] = i
for i = 2 up to k - 1:
rowTable[(2k - 1) - (i - 2)] = i
resultRows = new array of strings of length k
for i = 1 up to the length of your string:
Append the current character to resultRows[rowTable[i mod k]]
Concatenate all the entries of resultRows
Этот подход не требует жесткого кодирования во всех различных случаях в оператор switch, что означает, что он может обрабатывать произвольные k
вместо просто k = 3. Более того, он очень быстрый;время выполнения - O (n + k), где n - длина строки, а k - количество строк.
Надеюсь, это поможет!