当前位置: 首页 > article >正文

LeetCode-Z 字形变换(006)

一.题目描述

将一个给定字符串 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 <= s.length <= 1000
  • s 由英文字母(小写和大写)、',' 和 '.' 组成
  • 1 <= numRows <= 1000

四.解法:

方法一:模拟

我们用一个二维数组 g 来模拟 Z 字形排列的过程,其中 g[i][j] 表示第 i 行第 j 列的字符。初始时 i=0,另外我们定义一个方向变量 k,初始时 k=−1,表示向上走。

我们从左到右遍历字符串 s,每次遍历到一个字符 c,将其追加到 g[i] 中,如果此时 i=0 或者 i=numRows−1,说明当前字符位于 Z 字形排列的拐点,我们将 k 的值反转,即 k=−k。接下来,我们将 i 的值更新为 i+k,即向上或向下移动一行。继续遍历下一个字符,直到遍历完字符串 s,我们返回 g 中所有行拼接后的字符串即可。

时间复杂度 O(n),空间复杂度 O(n)。其中 n 为字符串 s 的长度。

五.代码

Java代码

class Solution {
    public String convert(String s, int numRows) {
        // 如果只有一行,直接返回原字符串
        if (numRows == 1) {
            return s;
        }
        
        // 创建一个 StringBuilder 数组,每个 StringBuilder 用于存储一行的字符
        StringBuilder[] g = new StringBuilder[numRows];
        // 初始化每个 StringBuilder
        Arrays.setAll(g, k -> new StringBuilder());
        
        // i 表示当前行索引,k 表示方向(向下为1,向上为-1)
        int i = 0, k = -1;
        
        // 遍历字符串中的每个字符
        for (char c : s.toCharArray()) {
            // 将字符添加到当前行的 StringBuilder 中
            g[i].append(c);
            
            // 如果到达第一行或最后一行,改变方向
            if (i == 0 || i == numRows - 1) {
                k = -k;
            }
            
            // 根据方向更新行索引
            i += k;
        }
        
        // 将所有行的 StringBuilder 合并成一个字符串并返回
        return String.join("", g);
    }
}

注释说明
    ·特殊情况处理:如果 numRows 为 1,直接返回原字符串,因为不需要进行 Z 字形转换。
    ·StringBuilder 数组:用于存储每一行的字符,最终将这些行合并成结果字符串。
    ·方向控制:使用变量 k 控制当前字符的添加方向,k 为 1 表示向下,-1 表示向上。
    ·字符遍历:遍历字符串 s 中的每个字符,将其添加到对应行的 StringBuilder 中。
    ·合并结果:使用 String.join 方法将所有行的 StringBuilder 合并成一个完整的字符串。

🌟 关注我的CSDN博客,收获更多技术干货! 🌟


http://www.kler.cn/a/454830.html

相关文章:

  • 常见的邮件协议SMTP和POP3
  • 使用 Spring Boot 实现文件上传:从配置文件中动态读取上传路径
  • 嵌入式硬件杂谈(七)IGBT MOS管 三极管应用场景与区别
  • 7-2 编辑距离问题
  • 高仿CSDN编辑器,前端博客模板
  • FPGA的DMA应用——pcileech
  • layui动态拼接生成下拉框验证必填项失效问题
  • 曼哈顿图如何指定不同染色体不同的颜色
  • 【Linux命令】ps -a 和 ps -ef 的区别
  • MySQL 服务正在启动.MySQL 服务无法启动.服务没有报告任何错误。请键入 NET HELPMSG 3534 以获得更多的帮助。总结较全 (已解决)
  • 香港站群服务器如何排查 Linux 系统的内存泄漏问题
  • 远程作业专家指导调度系统
  • 中巨伟业推出高安全高性能32位智能卡内核可编程加密芯片SMEC88SP/ST
  • 通过百度api处理交通数据
  • Java中处理if-else的几种高级方法
  • 用Excel表格在线发布期末考试成绩单
  • USB免驱IC读写器QT小程序开发
  • 计算机网络 (9)数据链路层
  • 深度学习在图像识别中的最新进展与实践案例
  • 如何在 Vue 中处理 API 请求?
  • 第3章 并行循环调度的准则
  • c++ 打开摄像头并显示摄像头捕获的数据
  • 【进阶编程】代理模式和适配模式的比较
  • 【视觉惯性SLAM:八、ORB-SLAM2:特征匹配】
  • 外键约束的应用层维护
  • Spring Boot 自动配置:从 spring.factories 到 AutoConfiguration.imports