LeetCode第六题:Z 字形变换 【6/1000 python】

2024-04-04 14:04

本文主要是介绍LeetCode第六题:Z 字形变换 【6/1000 python】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

👤作者介绍:10年大厂数据\经营分析经验,现任大厂数据部门负责人。
会一些的技术:数据分析、算法、SQL、大数据相关、python
作者专栏每日更新:
LeetCode解锁1000题: 打怪升级之旅

LeetCode解锁1000题: 打怪升级之旅https://blog.csdn.net/cciehl/category_12625714.html
python数据分析可视化:企业实战案例https://blog.csdn.net/cciehl/category_12615648.html
备注说明:方便大家阅读,统一使用python,带必要注释,公众号 数据分析螺丝钉 一起打怪升级

在力扣(LeetCode)的题库中,"Z 字形变换"是一个独特的字符串处理问题,它考验着对字符串操作的精确控制和对问题模型的理解。本文将深入探讨这个问题,并提供一个高效的解决方案。

问题描述

给定一个字符串和一个行数,要求你按照从上往下、从左到右的顺序,进行 Z 字形排列。

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

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

之后,你的输出需要按行读取,输出一个新的字符串,即 "PAHNAPLSIIGYIR"

解题思路

观察 Z 字形排列,我们可以发现,除了第一行和最后一行外,其他每一行中间都会夹杂一个来自斜线上的字符。每一“轮”Z字形的字符数是固定的,为 2 * numRows - 2(除去首尾两行后,上下两部分各占据 numRows - 1,加上首尾两行即得公式)。

基于这个观察,我们可以通过计算每个字符在 Z 字形排列中的位置,从而构建出最终的字符串。

解题步骤

  1. 创建一个数组,长度等于给定的行数,用于存储每行的字符。
  2. 遍历给定字符串的每个字符,计算出该字符应该放置在哪一行。
  3. 按照从上到下、从左到右的顺序,将字符添加到对应行的字符串中。
  4. 最后,将这些行连接起来,形成最终的字符串。

代码示例

初步尝试:直接模拟

最初可能会尝试直接按照 Z 字形排列的逻辑去模拟整个过程,例如,尝试为每一行和斜线创建单独的存储空间,然后尝试填充它们。

def convert_v1(s: str, numRows: int) -> str:# 特殊情况处理if numRows == 1 or numRows >= len(s):return s# 初始化存储结构z_matrix = [[] for _ in range(numRows)]row, down = 0, Truefor c in s:z_matrix[row].append(c)if row == numRows - 1:down = Falseelif row == 0:down = Truerow += 1 if down else -1# 结果拼接result = ''for r in z_matrix:result += ''.join(r)return result

问题:这个方法试图通过控制方向变量 down 来模拟“Z”字形的折返运动,但实际上它忽略了在 numRows 为 1 或者输入字符串很短时的特殊情况,容易造成索引错误或者不必要的复杂度。

改进:合并斜线到行

认识到斜线上的字符其实可以直接并入对应的行中,不需要单独处理斜线部分,这样可以简化代码和逻辑。

def convert_v2(s: str, numRows: int) -> str:if numRows == 1 or numRows >= len(s):return srows = [''] * numRowscurrent_row, step = 0, -1for char in s:rows[current_row] += charif current_row == 0 or current_row == numRows - 1:step = -stepcurrent_row += stepreturn ''.join(rows)

这个版本已经比较接近最终的解法了,但仍然可以在细节上进行优化和规范,例如增加注释来提高代码的可读性。

最终版本:增加注释和细节优化

在最终版本中,我们添加了必要的注释,并确保代码清晰、简洁、易于理解。

def convert(s: str, numRows: int) -> str:# 处理特殊情况,提高效率if numRows == 1 or numRows >= len(s):return s# 初始化存储每行字符串的列表rows = [''] * numRows# 初始化当前行和行进方向current_row, step = 0, -1for char in s:rows[current_row] += char# 到达Z字形的顶部或底部时,改变方向if current_row == 0 or current_row == numRows - 1:step = -stepcurrent_row += step# 将所有行的字符串连接并返回return ''.join(rows)# 示例测试代码
s = "PAYPALISHIRING"
numRows = 3
print(convert(s, numRows))  # 输出: "PAHNAPLSIIGYIR"

代码解释

  • 初始化一个列表 rows,长度为 numRows,用于存储每一行的字符串。
  • 使用 current_row 来追踪当前字符应该放在哪一行。step 用于控制行号的增减,实现“Z”字形的折返运动。
  • 遍历字符串中的每个字符,根据当前行号添加到相应的行字符串中。当当前行号为第一行或最后一行时,改变行号的增减方向。
  • 最后,使用 ''.join(rows) 将所有行的字符串连接成一个字符串。

结语

"Z 字形变换"问题通过模拟字符串的重新排列过程,不仅测试了对字符串处理的能力,也考察了对问题的逻辑分析和转换能力。如果本文对你有帮助,点赞是对作者最大的鼓励哦!

 

这篇关于LeetCode第六题:Z 字形变换 【6/1000 python】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中反转字符串的常见方法小结

《Python中反转字符串的常见方法小结》在Python中,字符串对象没有内置的反转方法,然而,在实际开发中,我们经常会遇到需要反转字符串的场景,比如处理回文字符串、文本加密等,因此,掌握如何在Pyt... 目录python中反转字符串的方法技术背景实现步骤1. 使用切片2. 使用 reversed() 函

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

使用Docker构建Python Flask程序的详细教程

《使用Docker构建PythonFlask程序的详细教程》在当今的软件开发领域,容器化技术正变得越来越流行,而Docker无疑是其中的佼佼者,本文我们就来聊聊如何使用Docker构建一个简单的Py... 目录引言一、准备工作二、创建 Flask 应用程序三、创建 dockerfile四、构建 Docker

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核