Зигзагообразное преобразование
Строка
"PAYPALISHIRING"
записывается зигзагообразным узором в заданном количестве рядов следующим образом: (вы можете захотеть отобразить этот узор фиксированным шрифтом для лучшей читаемости)ПАН АПЛСИИГ YIRА потом читать строчку за строчкой:
"PAHNAPLSIIGYIR"
Напишите код, который будет принимать строку и выполнять это преобразование с заданным количеством строк:
преобразование строки (строка s, int numRows);Пример 1:
Ввод: s = "PAYPALISHIRING", numRows = 3 Вывод: "PAHNAPLSIIGYIR"Пример 2:
Ввод: s = "PAYPALISHIRING", numRows = 4 Вывод: "PINALSIGYAHRPI" Объяснение: ПРИКОЛОТЬ АЛСИГ ЯХР ПИПример 3:
Ввод: s = "A", numRows = 1 Вывод: "A"Ограничения:1 <= s.length <= 1000
s
состоит из английских букв (строчных и прописных)','
и'.'
.1 <= numRows <= 1000
Решение данной задачи можно осуществить следующим образом:
- Создать пустой список (список) строк, количество элементов в списке должно быть равно заданному количеству строк (numRows).
- Создать переменную (переменную) для представления списка в списке (строке).
- Создать флаг (флаг) для направления движения по строке (направление).
- Итерироваться по каждому символу в заданной строке.
- Добавить символ в соответствующую заявку в списке.
- Если достигнута последняя строка, измените направление движения регулятора на «вверх».
- Если достигнута первая строка, изменить направление движения регулятора на «вниз».
- Увеличивать или уменьшать переменную амплитуды зависимости от регулятора направления движения.
- Соедините все строки из списка в одной строке и верните ее в качестве результата.
Ниже приведены примеры решений данной задачи
Решение задачи «Зигзагообразное преобразование» пример кода на Python
class Solution(object): def convert(self, s, numRows): # Если только одна строка, возвращаем исходную строку if numRows == 1: return s # Создаем пустой список строк, количество строк равно numRows rows = [''] * numRows # Переменная для отслеживания текущей строки и направления движения по строкам row, direction = 0, 1 # Итерируемся по каждому символу в строке s for char in s: # Добавляем текущий символ в соответствующую строку в списке rows rows[row] += char # Если достигнута первая строка, изменяем направление движения на "вниз" # Если достигнута последняя строка, изменяем направление движения на "вверх" if row == 0: direction = 1 elif row == numRows - 1: direction = -1 # Увеличиваем или уменьшаем переменную текущей строки в зависимости от направления движения row += direction # Соединяем все строки из списка rows в одну строку и возвращаем ее в качестве результата return ''.join(rows)
Решение задачи «Зигзагообразное преобразование» пример кода на Java
class Solution { public String convert(String s, int numRows) { // Проверяем, если numRows равно 1, возвращаем исходную строку if (numRows == 1) { return s; } // Создаем массив строк rows длиной numRows и заполняем его пустыми строками String[] rows = new String[numRows]; for (int i = 0; i < numRows; i++) { rows[i] = ""; } // Инициализируем переменные текущей строки row и направления direction int row = 0; int direction = 1; // Итерируемся по каждому символу в заданной строке s for (char c : s.toCharArray()) { // Добавляем текущий символ c в соответствующую строку rows[row] rows[row] += c; // Если достигнута первая строка, меняем направление на "вниз" (direction = 1) if (row == 0) { direction = 1; // Если достигнута последняя строка, меняем направление на "вверх" (direction = -1) } else if (row == numRows - 1) { direction = -1; } // Увеличиваем или уменьшаем переменную текущей строки row в зависимости от направления direction row += direction; } // Объединяем все строки из массива rows в одну строку result и возвращаем ее String result = ""; for (String rowString : rows) { result += rowString; } return result; } }
Решение задачи «Зигзагообразное преобразование» пример кода на C++
class Solution { public: string convert(string s, int numRows) { // Если строка имеет только одну строку, возвращаем исходную строку if (numRows == 1) { return s; } // Создаем вектор с заданным количеством строк vector<string> rows(numRows); // Инициализируем переменную текущей строки int row = 0; // Инициализируем флаг направления движения по строкам int direction = 1; // Итерируемся по каждому символу в заданной строке for (char c : s) { // Добавляем текущий символ в соответствующую строку в векторе rows[row] += c; // Если достигнута первая строка, изменяем флаг направления движения на "вниз" if (row == 0) { direction = 1; } // Если достигнута последняя строка, изменяем флаг направления движения на "вверх" else if (row == numRows - 1) { direction = -1; } // Увеличиваем или уменьшаем переменную текущей строки в зависимости от флага направления движения row += direction; } // Инициализируем результирующую строку string result = ""; // Объединяем все строки из вектора в одну строку for (string rowString : rows) { result += rowString; } // Возвращаем результирующую строку return result; } };
Решение задачи «Зигзагообразное преобразование» пример кода на JavaScript
/** * @param {string} s * @param {number} numRows * @return {string} */ var convert = function(s, numRows) { // если numRows равно 1, вернуть исходную строку if (numRows === 1) return s; // создаем массив, содержащий numRows пустых строк const rows = new Array(numRows).fill(''); let currentRow = 0; let goingDown = false; // итерируемся по каждому символу в исходной строке for (const char of s) { rows[currentRow] += char; // меняем направление движения, если достигнута верхняя или нижняя границы зигзага if (currentRow === 0 || currentRow === numRows - 1) goingDown = !goingDown; // изменяем текущую строку в соответствии с направлением движения currentRow += goingDown ? 1 : -1; } // соединяем все строки в одну строку и возвращаем ее return rows.join(''); };
Решение задачи «Зигзагообразное преобразование» пример кода на C#
public class Solution { public string Convert(string s, int numRows) { // если numRows равно 1, то просто возвращаем текст, т.к. нет необходимости менять его if (numRows == 1) return s; // создаем массив строк для каждой строки зигзага string[] rows = new string[numRows]; // индекс текущей строки зигзага int currentRow = 0; // флаг, указывающий направление движения по строкам зигзага (вверх или вниз) bool goingDown = false; // проходимся по всем символам текста и добавляем их в соответствующую строку зигзага foreach (char c in s) { rows[currentRow] += c; // если достигли верхней или нижней границы зигзага, меняем направление движения if (currentRow == 0 || currentRow == numRows - 1) goingDown = !goingDown; // изменяем индекс текущей строки зигзага в зависимости от направления движения currentRow += goingDown ? 1 : -1; } // объединяем строки зигзага в одну строку и возвращаем ее return string.Join("", rows); } }
Если у вас не отображается решение последних задач, значит у вас включен блокировщик рекламы который вырезает эти ответы