[LeetCode]Z字形变换(ZigZag Conversion)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/X_1076/article/details/82350870

题目描述

将字符串 “PAYPALISHIRING” 以Z字形排列成给定的行数:

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

之后从左往右,逐行读取字符:”PAHNAPLSIIGYIR”
实现一个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);

示例 1:
输入: s = “PAYPALISHIRING”, numRows = 3
输出: “PAHNAPLSIIGYIR”

示例 2:
输入: s = “PAYPALISHIRING”, numRows = 4
输出: “PINALSIGYAHRPI”
解释:

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

解决方法

观察示例可知,往下走要走numRows步,往上走要走numRows-2步(除去头尾,因为和往下走重叠)
模拟Z字遍历字符串
1. 往下走numRows步
2. 往上走numRows-2步
3. 重复1,2直到字符串遍历结束

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

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

        int index = 0, len = s.length();
        while (index < len) {
            for (int row = 0; row < numRows && index < len; row++) // 往下走
                sbs[row].append(s.charAt(index++));
            for (int row = numRows - 2; row > 0 && index < len; row--) // 往上走
                sbs[row].append(s.charAt(index++));
        }

        for (int row = 1; row < numRows; row++)
            sbs[0].append(sbs[row]);

        return sbs[0].toString();
    }

原文链接:https://lierabbit.cn/2018/05/09/Z字形变换

猜你喜欢

转载自blog.csdn.net/X_1076/article/details/82350870