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将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

Python获取中国节假日数据记录入JSON文件

《Python获取中国节假日数据记录入JSON文件》项目系统内置的日历应用为了提升用户体验,特别设置了在调休日期显示“休”的UI图标功能,那么问题是这些调休数据从哪里来呢?我尝试一种更为智能的方法:P... 目录节假日数据获取存入jsON文件节假日数据读取封装完整代码项目系统内置的日历应用为了提升用户体验,

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Python Websockets库的使用指南

《PythonWebsockets库的使用指南》pythonwebsockets库是一个用于创建WebSocket服务器和客户端的Python库,它提供了一种简单的方式来实现实时通信,支持异步和同步... 目录一、WebSocket 简介二、python 的 websockets 库安装三、完整代码示例1.

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

Python使用自带的base64库进行base64编码和解码

《Python使用自带的base64库进行base64编码和解码》在Python中,处理数据的编码和解码是数据传输和存储中非常普遍的需求,其中,Base64是一种常用的编码方案,本文我将详细介绍如何使... 目录引言使用python的base64库进行编码和解码编码函数解码函数Base64编码的应用场景注意

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

Python如何使用__slots__实现节省内存和性能优化

《Python如何使用__slots__实现节省内存和性能优化》你有想过,一个小小的__slots__能让你的Python类内存消耗直接减半吗,没错,今天咱们要聊的就是这个让人眼前一亮的技巧,感兴趣的... 目录背景:内存吃得满满的类__slots__:你的内存管理小助手举个大概的例子:看看效果如何?1.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专