首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >6. Z字形变换

6. Z字形变换

作者头像
用户7447819
发布2021-07-23 14:39:26
3250
发布2021-07-23 14:39:26
举报
文章被收录于专栏:面试指北面试指北面试指北

6. Z字形变换

1.题目描述

将一个给定字符串 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"

2.题解

题目本质上是一个字符串相关的问题。我们从左往右遍历字符串的时候,只需要确定该字符串所在的行数即可。我们定义一个变量为currentRow表示当前行,初始化为0。

在遍历的过程中,当前行的往下走,或者往上走。

我们用downDirection表示,当前行的前进方向。如果downDirection为true,则currentRow加一,否则减1。而downDirection在第一行或者最后一行的时候,状态会反转。

2.1 解题步骤

  • 确定按z字排列,总共有多少行。
  • 初始化一个跟行数相同的列表rows,列表中的元素是StringBuilder。
  • 遍历输入的字符串,在当前行的StringBuiler上添加字符。
  • 更新当前行currentRow
  • 更新downDirection
  • 遍历rows中的元素,转化为想要的输出结果
class Solution {
    public String convert(String s, int numRows) {
        if (numRows == 1) {
            return s;
        }
        List<StringBuilder> rows = new ArrayList<>();

        for (int i = 0; i < Math.min(numRows,s.length()); i++) {
            rows.add(new StringBuilder());
        }

        boolean downDirection = true;
        int currentRow = 0;
        for(char c : s.toCharArray()){
            rows.get(currentRow).append(c);
            // 方向向下
            if(downDirection) {
                currentRow = currentRow + 1;
            } else {
            // 方向向上
                currentRow = currentRow - 1;
            }
            // 更新方向
            if (currentRow == 0 || currentRow == numRows - 1) {
                downDirection = !downDirection;
            }
        }
        StringBuilder result = new StringBuilder();
        for(StringBuilder row : rows) {
            result.append(row.toString());
        }
        return result.toString();
    }
}

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-02-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 面试指北 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 6. Z字形变换
    • 1.题目描述
      • 2.题解
        • 2.1 解题步骤
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档