leetCode-6: Z 字形变换

题目描述

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:

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

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

解题思路

步骤
(1)将原始字符串按照 "W"(倒"N")型排列;
(2)将重新排列后的字符串按行输出
代码展示
public class Convert {

    public static String convert(String s, int numRows) {
        // 如果只有 1 行,原样返回
        if (numRows == 1) {
            return s;
        }
        StringBuilder[] stringBuilder = new StringBuilder[numRows];
        for (int i = 0; i < numRows; i++) {
            stringBuilder[i] = new StringBuilder();
        }
        // 1 表示往下遍历, -1 表示往上遍历
        int direction = 1;
        int lines = 0;
        for (int i = 0; i < s.length(); i++) {
            stringBuilder[lines].append(s.charAt(i));
            if (lines == 0) {
                direction = 1;
            }
            if (lines == numRows - 1) {
                direction = -1;
            }
            lines += direction;
        }
        StringBuilder resultString = new StringBuilder();
        for (int i = 0; i < numRows; i++) {
            resultString.append(stringBuilder[i]);
        }
        return resultString.toString();
    }

    public static void main(String[] args) {
        String s = "PAYPALISHIRING";
        int numRows = 5;
        String result = convert(s, numRows);
        System.out.println(result);
    }

}

图解示例

以题目中所给字符串 s = “PAYPALISHIRING”numRows = 3 为例,首先需要进行 “W”(倒 “N”)型排列。思路如下:
(1)开辟 numRows 个一维的 StringBuilder[] 数组,分别为:stringBuilder[0], stringBuilder[1], stringBuilder[2],用来存储每一行的字符,变量 lines 作为
stringBuilder[] 的循环变量,lines 初始化为 0
(2)使用循环变量 i 循环遍历原始字符串 s,将 s 中的每一个字符赋值给符合条件的 stringBuilder[lines] ;
(3)需要一个额外的方向变量 direction 来控制当前字符需要赋值给上面还是下面的 stringBuilder[lines],该方向变量初始化为 1,表示向下赋值,当遍历到 lines = numRows - 1 时,改变方向,使之向上赋值;
在这里插入图片描述i = 0 时,lines = 0, 所以 stringBuilder[0] = ‘P’, direction = 1, 所以下一个被赋值的数组应该是 stringBuilder[1];
i = 0 时,lines = 1, 所以 stringBuilder[1] = ‘A’, direction = 1, 所以下一个被赋值的数组应该是 stringBuilder[2];
i = 0 时,lines = 2, 所以 stringBuilder[2] = ‘Y’, 此时,lines == numRows - 1,所以需要改变方向,即direction = -1, 所以下一个被赋值的数组应该是 stringBuilder[1];
如此循环,最终便得到了W 型的数组:
在这里插入图片描述然后接下来需要做的就是将 stringBuilder[lines] 中的数据拼接即可,于是最终便会得到 PAHNAPLSIIGYIR 的新字符串。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值