题目描述

将字符串 "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/...


LieRabbit
920 声望2.6k 粉丝

有些梦虽然遥不可及,但并不是不可能实现,只要我足够的强