LeetCode 解题报告 - 6. ZigZag Conversion

对 hard 类型的题,表示目前实在是 hold 不住,暂时先不刷啊。等我刷完 easy 和 medium 回头再战! 2016/10/10
编程语言是 Java,代码托管在我的 GitHub 上,包括测试用例。欢迎各种批评指正!


题目 —— ZigZag Conversion

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of row like this: (You may want to display this pattern in a fixed font for better legibility)

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

And then read line by line: "PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:

string convert(string text, int nRows);

convert("PAYPALISHIRING", 3)should return "PAHNAPLSIIGYIR".

解答

  • 题目大意
    给出一个字符串,给出行数,按照这个行数将字符串写成 zigzag 模式,然后按行读出来。

  • 解题思路

    • 我们先来观察一下这个 zigzag 模式,我们发现,是按照行读的,所以每行都可以使用一个 StringBuilder 来存储。
    • 观察列,每一个竖直的列都有 numRows 行,其他斜的列有 numRows-2 行,我们按照这个特点来填充 StringBuilder[] 数组即可。
  • 代码实现

public class Solution {
    public String convert(String s, int numRows) {
        StringBuilder[] sb = new StringBuilder[numRows];
        for (int i = 0; i < numRows; i++) {
            sb[i] = new StringBuilder();
        }
        int i = 0;
        while (i < s.length()) {
            for (int rowIndex = 0; rowIndex < numRows && i < s.length(); rowIndex++) {
                sb[rowIndex].append(s.charAt(i++));
            }
            for (int rowIndex = numRows - 2; rowIndex > 0 && i < s.length(); rowIndex--) {
                sb[rowIndex].append(s.charAt(i++));
            }
        }
        for (i = 1; i < numRows; i++) {
            sb[0].append(sb[i]);
        }
        return sb[0].toString();
    }
}
  • 小结
    对于这种看似“花样”的题目,刚上来可能是一脸懵逼,但仔细分析过后会发现排列规律,找准数据结构(本题中就是 StringBuilder 数组)即可迅速解决。另外,本题需要注意的是,对于 StringBuilder 数组,每一个元素(对象)都需要初始化。最后还需要将所有的 StringBuilder 连接起来。

你可能感兴趣的:(LeetCode 解题报告 - 6. ZigZag Conversion)