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

java练习(38)

ps:题目来自力扣

Z字形交换

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:

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

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"

class Solution {
    public String convert(String s, int numRows) {
        // 如果行数为 1 或者行数大于等于字符串长度,直接返回原字符串
        if (numRows == 1 || numRows >= s.length()) {
            return s;
        }

        // 用于存储每一行的字符串
        StringBuilder[] rows = new StringBuilder[numRows];
        for (int i = 0; i < numRows; i++) {
            rows[i] = new StringBuilder();
        }

        int currentRow = 0;
        // 方向,1 表示向下,-1 表示向上
        int direction = 1;

        for (char c : s.toCharArray()) {
            rows[currentRow].append(c);
            // 到达第一行,改变方向为向下
            if (currentRow == 0) {
                direction = 1;
            } 
            // 到达最后一行,改变方向为向上
            else if (currentRow == numRows - 1) {
                direction = -1;
            }
            // 根据方向移动到下一行
            currentRow += direction;
        }

        StringBuilder result = new StringBuilder();
        for (StringBuilder row : rows) {
            result.append(row);
        }

        return result.toString();
    }
}

代码解释

本题要求将给定字符串 s 按照指定的行数 numRows 进行 Z 字形排列,然后从左往右逐行读取排列后的字符,生成一个新的字符串。我们可以通过模拟 Z 字形排列的过程来解决这个问题。

具体步骤

  1. 处理特殊情况
    • 如果 numRows 为 1 或者 numRows 大于等于字符串 s 的长度,直接返回原字符串,因为此时 Z 字形排列就是原字符串本身。
  2. 初始化存储结构
    • 创建一个长度为 numRows 的 StringBuilder 数组 rows,用于存储每一行的字符。
    • 对数组中的每个元素进行初始化,创建一个空的 StringBuilder 对象。
  3. 模拟 Z 字形排列过程
    • 初始化当前行 currentRow 为 0,方向 direction 为 1(表示向下)。
    • 遍历字符串 s 中的每个字符:
      • 将当前字符添加到 rows[currentRow] 中。
      • 如果 currentRow 为 0,说明到达了第一行,将方向改为向下(direction = 1)。
      • 如果 currentRow 为 numRows - 1,说明到达了最后一行,将方向改为向上(direction = -1)。
      • 根据方向更新 currentRow 的值(currentRow += direction)。
  4. 合并结果
    • 创建一个新的 StringBuilder 对象 result
    • 遍历 rows 数组,将每个 StringBuilder 中的字符添加到 result 中。
  5. 返回结果
    • 将 result 转换为字符串并返回。

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

相关文章:

  • Win32/ C++ 简易对话框封装框架(多语言, 通知栏菜单, 拖拽文件处理)
  • git 小乌龟安装包及中文包
  • touchgfx的工作机制
  • DeepSeek开源周Day1:重磅发布FlashMLA,重新定义AI推理效率天花板
  • 今日运维之-Mac笔记本python环境问题
  • Postman参数介绍
  • Docker核心概念
  • 小迪安全-24天-文件管理,显示上传,黑白名单,访问控制
  • 大语言模型基础
  • 分布式文件系统HDFS
  • Ubuntu 下 nginx-1.24.0 源码分析 - ngx_cpuinfo 函数
  • Terser 与 Esbuild 比较
  • 如何在本地和服务器新建Redis用户和密码
  • 大数据开发平台的框架
  • 【python】提取word\pdf格式内容到txt文件
  • 自动驾驶中planning为什么要把横纵向分开优化?
  • Unity Shader 学习13:屏幕后处理 - 使用高斯模糊的Bloom辉光效果
  • Spring Boot 整合原生的 mybatis
  • C++与Python实现LiDAR点云投影对比:关键差异与易错点详解
  • TVS管学习记录