LeetCode 字形转换

73 阅读2分钟

LeetCode 字形转换

字形转换是一道比较常见的字符串处理题目,主要考察对字符串的操作以及细节处理的能力。在这篇文章中,我们将学习如何解决这个问题。本文使用Java语言实现。

  1. 题目描述

LeetCode第6题:ZigZag Conversion。题目要求我们将输入的字符串进行“Z”字形转换,以此输出新的字符串。

输入:字符串 s 以及行数 numRows

输出: 经过Z字形变换后,你的字符串应当为每行一个字符串,且所有字符串并排输出。

样例输入:

s = "LEETCODEISHIRING", numRows = 3

样例输出:

L C I R E T O E S I I G E D H N

解释:

输出的结果每行的字符数为4(如果长度不够则补空格),构成了一条“ Z ”形数组形状。

  1. 解题思路

我们可以按照“Z”字形的形状,将输入的字符串遍历一遍,并且将其存储在一个二维数组中(或者使用 StringBuilder 进行存储)。最后输出按行遍历二维数组即可。

2.1 定义二维数组

我们知道,Z字形的行数为 numRows,列数为字符串长度 s.length(),实现对应的二维数组就非常简单。

int col = s.length(); char[][] zigzagArray = new char[numRows][col];

2.2 构造二维数组

按照 Z 字形的规则将字符串 s 存储在 ZigZagArray 中即可,根据算法,每一行最多有 col /(2 * numRows - 2) 个完整的组,每组中会有两个元素。

// 填充第一列 int i = 0; while (i < s.length()) { for (int j = 0; j < numRows && i < s.length(); j++) { zigzagArray[j][0] = s.charAt(i); i++; } // 填充斜线上的元素,斜线的方向是向下的 for (int j = numRows - 2; j > 0 && i < s.length(); j--) { zigzagArray[j][numRows - j - 1] = s.charAt(i); i++; } }

如果 numRows 为 3 时,数组存储结果如下:

L . E T O E .

如果 numRows 为 4 时,数组存储结果如下:

L D E O I E C . T .

2.3 输出 ZigZagArray

输出 ZigZagArray 的结果即可,我这里使用 StringBuilder 进行字符串拼接:

{
StringBuilder sb = new StringBuilder();
    for (int m = 0; m < zigzagArray.length; m++)
        { for (int n = 0; n < zigzagArray[m].length; n++)
            { if (zigzagArray[m][n] != 0) 
            { sb.append(zigzagArray[m][n]); } 
        else { sb.append(" "); } 
        } 
        sb.append("\n"); 
    } 
return sb.toString();
}
  1. 完整代码实现

public String convert(String s, int numRows) { if (numRows < 2) { return s; }

int col = s.length();
char[][] zigzagArray = new char[numRows][col];

// 填充第一列
int i = 0;
while (i < s.length()) {
    for (int j = 0; j < numRows && i < s.length(); j++) {
        zigzagArray[j][0] = s.charAt(i);
        i++;
    }
    // 填充斜线上的元素,斜线的方向是向下的
    for (int j = numRows - 2; j > 0 && i < s.length(); j--) {
        zigzagArray[j][numRows - j - 1] = s.charAt(i);
        i++;
    }
}

// 打印字符矩阵
StringBuilder sb = new StringBuilder();
for (int m = 0; m < zigzagArray.length; m++) {
    for (int n = 0; n < zigzagArray[m].length; n++) {
        if (zigzagArray[m][n] != 0) {
            sb.append(zigzagArray[m][n]);
        } else {
            sb.append(" ");
        }
    }
    sb.append("\n");
}

return sb.toString();

}
  1. 总结

本文我们通过 LeetCode 给出的我们一道字符串处理的问题:字形转换,提高了我们对于字符串处理的熟练程度。我们首先了解了题目的描述与要求,然后深入分析了解决问题的思路,最后使用 Java 代码实现并给出运行结果。