【力扣刷题实战】Z字形变换

news2025/4/18 10:20:20

大家好,我是小卡皮巴拉

文章目录

目录

力扣题目:Z字形变换

题目描述

解题思路

问题理解

算法选择

具体思路

解题要点

完整代码(C++)

兄弟们共勉 !!! 


每篇前言

博客主页:小卡皮巴拉

咱的口号:🌹小比特,大梦想🌹

作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请大佬们批评斧正。

力扣题目:Z字形变换

原题链接:6. Z 字形变换 - 力扣(LeetCode)

题目描述

将一个给定字符串 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"

解题思路

问题理解

本题要求将给定字符串 s 按照指定的行数 numRows 进行 Z 字形排列,然后从左到右逐行读取排列后的字符,生成一个新的字符串。

算法选择

通过分析 Z 字形排列的规律,根据字符在原字符串中的索引位置来构建最终的结果字符串,而无需真正构建 Z 字形的二维矩阵,这样可以节省空间

具体思路

  1. 边界情况处理:当 numRows 为 1 时,字符串无需变换,直接返回原字符串 s

  2. 计算周期长度:计算 Z 字形排列的一个周期内字符的数量 d,公式为 d = 2 * numRows - 2

  3. 按行处理字符

    • 第一行:第一行的字符在原字符串中的索引间隔为 d,从索引 0 开始,依次将符合条件的字符添加到结果字符串 ret 中。

    • 中间行:对于中间的每一行(从第 1 行到第 numRows - 2 行),每个周期内有两个字符需要添加到结果字符串中。第一个字符的索引 i 从当前行号 k 开始,每次增加一个周期长度 d;第二个字符的索引 j 从 d - k 开始,每次也增加一个周期长度 d。在添加字符时,需要检查索引是否在字符串长度范围内。

    • 最后一行:最后一行的字符在原字符串中的索引间隔也为 d,起始索引为 numRows - 1,依次将符合条件的字符添加到结果字符串 ret 中。

  4. 返回结果:返回最终的结果字符串 ret

解题要点

  1. 周期规律分析:准确找出 Z 字形排列的周期长度 d 以及每一行字符在原字符串中的索引规律。

  2. 边界检查:在添加字符到结果字符串时,要检查索引是否在字符串长度范围内,避免越界访问。

  3. 按行处理:分别处理第一行、中间行和最后一行,确保每个字符都能正确添加到结果字符串中。

完整代码(C++)

class Solution {
public:
    string convert(string s, int numRows) 
    {
        // 处理边界情况:如果行数为 1,那么字符串无需变换,直接返回原字符串
        if(numRows == 1) return s;
        // 用于存储最终转换后的字符串
        string ret;
        // 计算一个循环周期的长度,Z 字形排列的一个周期内字符数量为 2 * numRows - 2
        int d = 2 * numRows - 2, n = s.size();
        // 1. 先处理第一行
        // 第一行的字符在原字符串中的索引间隔为 d
        for(int i = 0; i < n; i += d)
            ret += s[i];
        // 2. 处理中间行
        // 枚举每一行,从第 1 行到第 numRows - 2 行(因为第 0 行和第 numRows - 1 行单独处理)
        for(int k = 1; k < numRows - 1; k++)
            // 对于中间行的每个周期,有两个字符需要添加到结果字符串中
            // i 从当前行号 k 开始,每次增加一个周期长度 d
            // j 从 d - k 开始,每次也增加一个周期长度 d
            for(int i = k, j = d - k; i < n || j < n; i += d, j += d)
            {
                // 如果 i 索引在字符串长度范围内,将该字符添加到结果字符串中
                if(i < n) ret += s[i];
                // 如果 j 索引在字符串长度范围内,将该字符添加到结果字符串中
                if(j < n) ret += s[j];
            }
        // 3. 处理最后一行
        // 最后一行的字符在原字符串中的索引间隔也为 d,起始索引为 numRows - 1
        for(int i = numRows - 1; i < n; i += d)
            ret += s[i];
        // 返回转换后的字符串
        return ret;
    }
};

兄弟们共勉 !!! 

码字不易,求个三连

抱拳了兄弟们!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2331543.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣题解:142. 环形链表 II

在链表学习中&#xff0c;我们已经了解了单链表和双链表&#xff0c;两者的最后一个结点都会指向NULL&#xff1b;今天我们介绍的循环列表则不同&#xff0c;其末尾结点指向的这是链表中的一个结点。 循环链表是一种特殊类型的链表&#xff0c;其尾节点的指针指向头节点&#…

latex模板文件

LaTeX 是一款广泛应用于学术领域的​​文档排版系统​​&#xff0c;尤其以其在数学公式、科学符号和复杂技术文档排版中的强大能力著称。虽然它本身并非专门的“数学软件”&#xff0c;但在处理数学相关内容时表现尤为出色。 1. LaTeX 的核心特点​ 数学公式支持​​&#xff…

BLE 协议栈事件驱动机制详解

在 BlueNRG-LP 等 BLE 系统中,事件驱动是控制状态转移、数据交互和外设协作的基础。本文将深入讲解 BLE 协议栈中事件的来源、分发流程、处理结构与实际工程实践策略,帮助你构建稳定、可维护的 BLE 系统。 📦 一、BLE 事件的来源分类 BLE 协议栈中的事件严格来自协议栈本身…

Rust 之四 运算符、标量、元组、数组、字符串、结构体、枚举

概述 Rust 的基本语法对于从事底层 C/C 开发的人来说多少有些难以理解&#xff0c;虽然官方有详细的文档来介绍&#xff0c;不过内容是相当的多&#xff0c;看起来也费劲。本文通过将每个知识点简化为 一个 DEMO 每种特性各用一句话描述的形式来简化学习过程&#xff0c;提高学…

fuse-python使用fuse来挂载fs

winfsp 安装winfsp,https://winfsp.dev/ fusepy python安装fusepy #!/usr/bin/env python3 import os import stat from fuse import FUSE, FuseOSError, Operationsclass Passthrough(Operations):def __init__(self, root):self.root root# 辅助函数&#xff1a;将挂载点…

基于ueditor编辑器的功能开发之增加自定义一键排版功能

用户有自己的文章格式&#xff0c;要求复制或者粘贴进来的文章能够一键排版&#xff0c;不需要手动调试 这个需求的话咱们就需要自己去注册一个事件啦&#xff0c;这里我没有修改源码&#xff0c;而是在编辑器初始化之后给他注册了一个事件 我的工具列表变量 vue组件中data中…

VS Code Markdown渲染配置

VS code markdown preview enhanced插件渲染配置 mac: commandshiftP命令输入Markdown Preview Enhanced: Customize CSS&#xff0c;并点击在打开的style.less配置文件添加一下配置 /* Please visit the URL below for more information: */ /* https://shd101wyy.github.…

数据结构篇:线性表的另一表达—链表之单链表(上篇)

目录 1.链表的引入 1.1 链表的概念 1.2 next的意义 2.链表的分类 3.单链表的实现 3.1 单链表实现接口 3.1.1 插入节点函数封装 3.1.2 尾插 3.1.3 头插 3.1.4 报错的根本问题 3.1.5 头删 3.1.6 尾删 4.小结 1.链表的引入 根据顺序表的一些缺陷…

SpringBoot企业级开发之【用户模块-获取用户详细信息】

接口文档的要求&#xff1a; 了解一下token令牌头是怎么用的 我们直接放到前端交互的controller类下&#xff0c;在声明的方法中加入参数为String token且加入注解RequestHeader(name"Authorization【你自己设定的token】") 设计思路: 实战开发&#xff1a; control…

Mockito如何对静态方法进行测试

在 Mockito 中,直接对静态方法进行模拟是困难的,因为 Mockito 的设计理念是优先通过依赖注入(DI)管理对象,而静态方法破坏了这种设计(难以解耦)。不过,从 Mockito 3.4.0 版本开始,通过 mockStatic 方法支持了对静态方法的模拟(需配合 mockito-inline 依赖)。 从 Mo…

Navicat 17 for Mac 数据库管理

Navicat 17 for Mac 数据库管理 一、介绍 Navicat Premium 17 for Mac是一款专业的数据库管理工具&#xff0c;适用于开发人员、数据库管理员和分析师等用户。它提供了强大的数据管理功能和丰富的工具&#xff0c;使用户能够轻松地管理和维护数据库&#xff0c;提高数据处理效…

grok 驱动级键盘按键记录器分析

grok是一个驱动模块&#xff0c;其主要功能就行进行键盘按键及剪切板数据的记录&#xff0c;也就是一个键盘记录器。实现原理是通过对shadow-ssdt的相关函数进行hook,和r3对GetUserMessage进行hook的原理差不多。 关键部分如下&#xff1a; 查找csrss.exe进程是否已经启动&…

MyBatis中特殊符号处理总结

前言 MyBatis 是一款流行的Java持久层框架&#xff0c;广泛应用于各种类型的项目中。因为我们在日常代码 MyBatis 动态拼接语句时&#xff0c;会经常使用到 大于(>,>)、小于(<,<)、不等于(<>、!)操作符号。由于此符号包含了尖括号&#xff0c;而 MyBatis 使用…

MYSQL——SQL语句到底怎么执行

查询语句执行流程 MySQL 查询语句执行流程 查询缓存&#xff08;Query Cache&#xff09; MySQL内部自带了一个缓存模块&#xff0c;默认是关闭的。主要是因为MySQL自带的缓存应用场景有限。 它要求SQL语句必须一摸一样表里面的任何一条数据发生变化时&#xff0c;该表所有缓…

智能血压计WT2801芯片方案-BLE 5.0无线传输、高保真语音交互、LED显示驱动、低功耗待机四大技术赋能

在智能健康设备飞速发展的今天&#xff0c;血压计早已不再是简单的“测量工具”&#xff0c;而是家庭健康的“智能管家”。然而&#xff0c;一台真正可靠、易用、功能全面的血压计&#xff0c;离不开一颗强大的“核心芯片”。 今天&#xff0c;我们揭秘医疗级芯片WT2801的硬核实…

基于51单片机的智能火灾报警系统—温度烟雾检测、数码管显示、手动报警

基于51单片机的火灾报警系统 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 由51单片机MQ-2烟雾传感ADC0832模数转换芯片DS18B20温度传感器数码管显示按键模块声光报警模块构成 具体功能&#xff1a;…

指定运行级别

linux系统下有7种运行级别,我们需要来了解一下常用的运行级别,方便我们熟悉以后的部署环境,话不多说,来看. 开机流程&#xff1a; 指定数级别 基本介绍 运行级别说明: 0:关机 相当于shutdown -h now ⭐️默认参数不能设置为0,否则系统无法正常启动 1:单用户(用于找回丢…

Python标准库:sys模块深入解析

sys模块是Python标准库中一个非常重要的内置模块&#xff0c;它提供了与Python解释器及其环境交互的多种功能。本文将深入探讨sys模块的各个方面&#xff0c;帮助开发者更好地理解和利用这个强大的工具。 1. sys模块概述 sys模块提供了对由解释器使用或维护的变量的访问&…

加油站小程序实战教程10开通会员

目录 1 修改用户登录逻辑2 创建变量3 调用API总结 我们上一篇搭建了开通会员的界面&#xff0c;有了界面的时候就需要加入一些逻辑来控制界面显示。我们的逻辑是当用户打开我的页面的时候&#xff0c;在页面加载完毕后调用API看用户是否已经开通会员了&#xff0c;如果未开通就…

没有他的“变换”,就没有今天的人工智能

从ChatGPT发布以来&#xff0c;大语言模型&#xff08;LLM&#xff09;是所有人追逐的方向&#xff0c;无论是将其看作“万能神”或是人工智能应用的基础构件&#xff0c;其重要性毋庸置疑。而随着大语言模型扩展到多模态领域&#xff0c;就需要更多的工具来帮助其进行处理。 例…