力扣经典150题第二十二题:Z 字形变换

2024-04-14 15:20

本文主要是介绍力扣经典150题第二十二题:Z 字形变换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

    • 力扣经典150题第二十二题:Z 字形变换
      • 1. 题目描述
      • 2. 解题思路
      • 3. 解题步骤
      • 4. 代码实现
      • 5. 时间复杂度分析
      • 6. 应用和扩展
      • 7. 总结
      • 8. 参考资料

力扣经典150题第二十二题: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”

提示:

1 <= s.length <= 1000
s 由英文字母(小写和大写)、‘,’ 和 ‘.’ 组成
1 <= numRows <= 1000

2. 解题思路

利用模拟的方法,模拟字符在 Z 字形排列中的行索引变化过程。具体步骤如下:

  1. 使用一个长度为 numRows 的列表 rows,每个元素代表 Z 字形中的一行字符串。
  2. 初始化一个变量 direction,表示当前字符遍历的行索引变化方向,初始为 1,表示向下遍历。
  3. 遍历字符串 s,依次将每个字符添加到对应的行字符串中。
  4. 当遍历到第一行或最后一行时,需要改变 direction 方向,实现字符的上下移动。
  5. 最后将 rows 中的每行字符串连接起来,形成最终的 Z 字形变换后的字符串。

3. 解题步骤

  1. 创建一个长度为 numRows 的列表 rows,每个元素初始化为空字符串。
  2. 初始化变量 index 表示当前字符的行索引,direction 表示当前行索引的变化方向。
  3. 遍历字符串 s,根据 direction 将每个字符添加到对应的行字符串中。
  4. 根据 direction 判断是否需要改变行索引的方向。
  5. rows 中的每行字符串连接起来,形成最终的 Z 字形变换后的字符串。

4. 代码实现

class Solution {public String convert(String s, int numRows) {if (numRows == 1) return s; // numRows 为 1,直接返回原字符串List<StringBuilder> rows = new ArrayList<>();for (int i = 0; i < Math.min(numRows, s.length()); i++) {rows.add(new StringBuilder());}int index = 0;int direction = 1; // 1 表示向下遍历,-1 表示向上遍历for (char ch : s.toCharArray()) {rows.get(index).append(ch);index += direction;if (index == 0 || index == numRows - 1) {direction = -direction; // 改变遍历方向}}StringBuilder result = new StringBuilder();for (StringBuilder row : rows) {result.append(row);}return result.toString();}
}

5. 时间复杂度分析

  • 遍历字符串 s,时间复杂度为 O(n),其中 n 是字符串长度。
  • 将字符添加到 rows 中的相应行字符串,时间复杂度为 O(n)。
  • rows 中的每行字符串连接起来,时间复杂度为 O(numRows)。
  • 总体时间复杂度为 O(n)。

6. 应用和扩展

  • 该算法可以应用于模拟 Z 字形排列,用于字符串的排列和变换。
  • 类似的模拟方法也可以用于其他字符串变换问题。

7. 总结

本文介绍了如何通过模拟 Z 字形排列的方式,将给定字符串按指定行数进行变换,得到 Z 字形变换后的结果字符串。

8. 参考资料

  • LeetCode 官网

这篇关于力扣经典150题第二十二题:Z 字形变换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/903336

相关文章

一道经典Python程序样例带你飞速掌握Python的字典和列表

Python中的列表(list)和字典(dict)是两种常用的数据结构,它们在数据组织和存储方面有很大的不同。 列表(List) 列表是Python中的一种有序集合,可以随时添加和删除其中的元素。列表中的元素可以是任何数据类型,包括数字、字符串、其他列表等。列表使用方括号[]表示,元素之间用逗号,分隔。 定义和使用 # 定义一个列表 fruits = ['apple', 'banana

力扣SQL50 每位经理的下属员工数量 join

Problem: 1731. 每位经理的下属员工数量 👨‍🏫 参考题解 Code select m.Employee_id, m.name,count(*) reports_count,round(avg(e.age),0) average_agefrom Employees ejoin Employees mon e.reports_to = m.Employee_id

前端 CSS 经典:文字描边

前言:文字描边有两种实现方式 1. text-shadow 设置 8 个方向的文字阴影,缺点是只有八个方向,文字转角处可能有锯齿状。不支持文字透明,设置 color: transparent,文字会成描边颜色。 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8" /><meta http-equiv="X-UA-Comp

LeetCode:经典题之141、142 题解及延伸

系列目录 88.合并两个有序数组 52.螺旋数组 567.字符串的排列 643.子数组最大平均数 150.逆波兰表达式 61.旋转链表 160.相交链表 83.删除排序链表中的重复元素 389.找不同 1491.去掉最低工资和最高工资后的工资平均值 896.单调序列 206.反转链表 92.反转链表II 141.环形链表 142.环型链表 目录 系列目录141. 环形链表常量因子 1

OSG数学基础:坐标系变换

三维实体对象需要经过一系列的坐标变换才能正确、真实地显示在屏幕上。在一个场景中,当读者对场景中的物体进行各种变换及相关操作时,坐标系变换是非常频繁的。坐标系变换通常包括:世界坐标系-物体坐标系变换、物体坐标系-世界坐标系变换和世界坐标系-屏幕坐标系变换(一个二维平面坐标系,即显示器平面,是非常标准的笛卡尔坐标系的第一象限区域)。 世界坐标系-物体坐标系变换 它描述的问题主要是关于物体本身的

【数据结构与算法 经典例题】使用队列实现栈(图文详解)

💓 博客主页:倔强的石头的CSDN主页               📝Gitee主页:倔强的石头的gitee主页    ⏩ 文章专栏:《数据结构与算法 经典例题》C语言                                   期待您的关注 ​​ 目录  一、问题描述 二、前置知识 三、解题思路 四、C语言实现代码 🍃队列实现代码:

海量数据处理经典思想

第一部分、十五道海量数据处理 1. 给定a、b两个文件,各存放50亿个url,每个url各占64字节,内存限制是4G,让你找出a、b文件共同的url?     方案1:可以估计每个文件安的大小为50G×64=320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。考虑采取分而治之的方法。 遍历文件a,对每个url求取,然后根据所取得的值将url分别存储到1000个小文件(

LeetCode:经典题之389 题解与延伸

系列目录 88.合并两个有序数组 52.螺旋数组 567.字符串的排列 643.子数组最大平均数 150.逆波兰表达式 61.旋转链表 160.相交链表 83.删除排序链表中的重复元素 389.找不同 1491.去掉最低工资和最高工资后的工资平均值 896.单调序列 206.反转链表 92.反转链表II 141.环形链表 142.环型链表 目录 系列目录389.找不同哈希表

力扣SQL50 游戏玩法分析 IV 子查询

Problem: 550. 游戏玩法分析 IV 👨‍🏫 参考题解 这个SQL查询的目的是计算每个玩家在登录后的第二天参与活动的比例。查询使用了子查询和左连接来实现这一目的。下面是查询的详细解释,包括每个部分的作用和注释: -- 计算每个玩家登录后第二天参与活动的比例select round(avg(a.event_date is not null), 2) as fractio

【pytorch06】 维度变换

常用API view/reshapesqueeze/unsqueezetranspose/t/permuteexpand/repeat view和reshape view操作的基本前提是保证numel()一致 a.view(4,28*28)的物理意义是把行宽以及通道合并在一起,对于4张图片,我们直接把所有数据都合在一起,用一个784维的向量来表示,这样所有的二维信息上下左右位置信息就忽略