Строка "PAYPALISHIRING" записывается зигзагообразным узором в заданном количестве строк следующим образом: (вы можете захотеть отобразить этот узор фиксированным шрифтом для лучшей читаемости)
P A H N A P L S I I G Y I R
А потом читать построчно: "PAHNAPLSIIGYIR"
Напишите код, который будет принимать строку и выполнять это преобразование с заданным количеством строк:
string convert(string s, int numRows);
Пример 1:
Input: s = "PAYPALISHIRING", numRows = 3 Output: "PAHNAPLSIIGYIR"
Пример 2:
Input: s = "PAYPALISHIRING", numRows = 4 Output: "PINALSIGYAHRPI" Explanation: P I N A L S I G Y A H R P I
Пример 3:
Input: s = "A", numRows = 1 Output: "A"
Ограничения:
1 <= s.length <= 1000sсостоит из английских букв (строчных и прописных),','и'.'.1 <= numRows <= 1000
Решения:
Чтобы решить эту проблему, мы можем перебрать входную строку и поместить каждый символ в соответствующую строку зигзагообразного шаблона.
Мы можем использовать переменную curRow, чтобы отслеживать текущую строку, в которую мы добавляем символ, и переменную goingDown, чтобы отслеживать, движемся ли мы в данный момент вниз по строкам или вверх по строкам.
Первоначально для curRow установлено значение 0, а для goingDown установлено значение true. Затем мы перебираем входную строку и делаем следующее:
- Добавьте текущий символ в
curRowстроку результата. - Если
curRowравноnumRows - 1, установитеgoingDownнаfalse. ЕслиcurRowравно 0, установитеgoingDownвtrue. - Если
goingDownравноtrue, увеличьтеcurRow. ЕслиgoingDownравноfalse, уменьшитеcurRow.
Питон:
class Solution(object):
def convert(self, s, numRows):
if numRows == 1:
return s
rows = [''] * numRows
curRow = 0
goingDown = True
for c in s:
rows[curRow] += c
if curRow == numRows - 1:
goingDown = False
elif curRow == 0:
goingDown = True
curRow += 1 if goingDown else -1
return ''.join(rows)
C#:
public class Solution {
public string Convert(string s, int numRows) {
if (numRows == 1)
{
return s;
}
string[] rows = new string[numRows];
int curRow = 0;
bool goingDown = true;
foreach (char c in s)
{
rows[curRow] += c;
if (curRow == numRows - 1)
{
goingDown = false;
}
else if (curRow == 0)
{
goingDown = true;
}
curRow += goingDown ? 1 : -1;
}
return string.Join("", rows);
}
}
Java:
class Solution {
public String convert(String s, int numRows) {
if (numRows == 1) {
return s;
}
String[] rows = new String[numRows];
Arrays.fill(rows, "");
int curRow = 0;
boolean goingDown = true;
for (char c : s.toCharArray()) {
rows[curRow] += c;
if (curRow == numRows - 1) {
goingDown = false;
} else if (curRow == 0) {
goingDown = true;
}
curRow += goingDown ? 1 : -1;
}
return String.join("", rows);
}
}
JavaScript:
/**
* @param {string} s
* @param {number} numRows
* @return {string}
*/
var convert = function(s, numRows) {
if (numRows === 1) {
return s;
}
let rows = new Array(numRows).fill("");
let curRow = 0;
let goingDown = true;
for (let c of s) {
rows[curRow] += c;
if (curRow === numRows - 1) {
goingDown = false;
} else if (curRow === 0) {
goingDown = true;
}
curRow += goingDown ? 1 : -1;
}
return rows.join("");
};
Типографический текст:
function convert(s: string, numRows: number): string {
if (numRows === 1) {
return s;
}
const rows = new Array(numRows).fill("");
let curRow = 0;
let goingDown = true;
for (const c of s) {
rows[curRow] += c;
if (curRow === numRows - 1) {
goingDown = false;
} else if (curRow === 0) {
goingDown = true;
}
curRow += goingDown ? 1 : -1;
}
return rows.join("");
};
PHP:
class Solution {
/**
* @param String $s
* @param Integer $numRows
* @return String
*/
function convert($s, $numRows) {
if ($numRows === 1) {
return $s;
}
$rows = array_fill(0, $numRows, "");
$curRow = 0;
$goingDown = true;
for ($i = 0; $i < strlen($s); $i++) {
$rows[$curRow] .= $s[$i];
if ($curRow === $numRows - 1) {
$goingDown = false;
} else if ($curRow === 0) {
$goingDown = true;
}
$curRow += $goingDown ? 1 : -1;
}
return implode("", $rows);
}
}
Надеюсь, это поможет! Дайте знать, если у вас появятся вопросы. Не забудьте подписаться, похлопать и оставить комментарий