Строка "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 <= 1000
  • s состоит из английских букв (строчных и прописных), ',' и '.'.
  • 1 <= numRows <= 1000

Решения:

Чтобы решить эту проблему, мы можем перебрать входную строку и поместить каждый символ в соответствующую строку зигзагообразного шаблона.

Мы можем использовать переменную curRow, чтобы отслеживать текущую строку, в которую мы добавляем символ, и переменную goingDown, чтобы отслеживать, движемся ли мы в данный момент вниз по строкам или вверх по строкам.

Первоначально для curRow установлено значение 0, а для goingDown установлено значение true. Затем мы перебираем входную строку и делаем следующее:

  1. Добавьте текущий символ в curRow строку результата.
  2. Если curRow равно numRows - 1, установите goingDown на false. Если curRow равно 0, установите goingDown в true.
  3. Если 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);
    }
}

Надеюсь, это поможет! Дайте знать, если у вас появятся вопросы. Не забудьте подписаться, похлопать и оставить комментарий