LeetCode: 6. Z字形转换

题目

将字符串 “PAYPALISHIRING” 以Z字形排列成给定的行数:(下面这样的形状)

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

之后按逐行顺序依次排列:”PAHNAPLSIIGYIR”

实现一个将字符串进行指定行数的转换的函数:

string convert(string text, int nRows);

convert(“PAYPALISHIRING”, 3) 应当返回 “PAHNAPLSIIGYIR” 。

分析

  • 解题方法有两种
    • 传统方法:利用二维数组按照题目描述放置元素,然后按行遍历
    • 优化方法:利用数学方程得出每个元素在最后的输出位置的表达式,直接输出最后位置
  • 下面用第一种方法解答,达到练手的目的

解题

class Solution {
    public String convert(String s, int numRows) {
        if (numRows == 1) {
            return s;
        }
        char[][] array = new char[numRows][s.length()];
        boolean flag = true;
        int j = -1;
        int k = 0;
        for (int i=0; i< s.length();i++) {
            if (flag && j1) {
                j++;
                array[j][k] = s.charAt(i);
                if (j == numRows-1) {
                    flag = false;
                }
                continue;
            }

            if (!flag && j > 0) {
                j--;
                k++;
                array[j][k] = s.charAt(i);
                if (j == 0) {
                    flag = true;
                } 
            }
        }
        StringBuilder data = new StringBuilder();
        for (int m = 0; m < numRows; m++) {
            for (int n = 0; n < s.length(); n++) {
                // 字符判空的方式
                if (array[m][n] != '\0') {
                    data.append(array[m][n]);
                }
            }
        }
        return data.toString();
    }
}

启示

  • 注意边界条件的判定
  • 注意循环的退出,是遇到结尾退出还是中断退出,是否需要再循环外部为不同类型的退出做好善后工作

优化

优化的方法也有规律可循,可以画图找规律: n 为行数

  • 第一行的元素:2n-2
  • 中间行的元素需要分两种情况
    • 纵向的:2n-2+i
    • 斜向的: 4n-4-i
  • 结尾行的元素:(2n-2)+(n-1) = 3n-3

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