用java 实现 Zigzag Conversion Z 字形变换(leetCode 算法)

Z字形变换(Zigzag Conversion)是LeetCode上一个有趣的字符串操作问题。题目要求我们把给定的字符串按照Z字形排列,并且按行读取这些字符,最后返回重新排列后的字符串。

例如,输入字符串 “PAYPALISHIRING” 和行数 numRows = 3 时,Z字形排列如下:

P   A   H   N
A P L S I I G
Y   I   R

然后按行读取得到的结果字符串为 “PAHNAPLSIIGYIR”。

下面是用Java实现这个算法的方法:

public class ZigzagConversion {
    public static String convert(String s, int numRows) {
        if (numRows == 1 || numRows >= s.length()) return s;

        StringBuilder[] rows = new StringBuilder[numRows];
        for (int i = 0; i < numRows; i++) 
            rows[i] = new StringBuilder();

        int currentRow = 0;
        boolean goingDown = false;

        for (char c : s.toCharArray()) {
            rows[currentRow].append(c);
            if (currentRow == 0 || currentRow == numRows - 1) goingDown = !goingDown;
            currentRow += goingDown ? 1 : -1;
        }

        StringBuilder ret = new StringBuilder();
        for (StringBuilder row : rows) 
            ret.append(row);

        return ret.toString();
    }

    public static void main(String[] args) {
        // 示例调用
        String input = "PAYPALISHIRING";
        int numRows = 3;
        System.out.println("The converted string is: " + convert(input, numRows));
    }
}

这段代码实现了convert方法,该方法接收一个字符串s和一个整数numRows作为参数,并返回经过Z字形变换后的字符串。首先,我们检查特殊情况:如果行数为1或大于等于字符串长度,则直接返回原字符串,因为此时不存在真正的Z字形变换。

接下来,我们创建了一个StringBuilder数组rows,每个元素用于存储每一行的字符。遍历字符串s中的每一个字符,根据当前行索引currentRow和方向标志goingDown来决定将字符添加到哪一行以及是否改变方向。当到达第一行或最后一行时,我们反转方向。

在所有字符都被处理完后,我们将每一行的内容连接起来,形成最终的结果字符串,并返回它。

main方法中给出了一段测试代码来展示如何调用convert方法。在这个例子中,输入字符串为"PAYPALISHIRING",行数为3,预期输出应该是"PAHNAPLSIIGYIR"。

你可能感兴趣的:(算法,java,leetcode)