力扣第六题——Z字形变换

题目介绍

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

完整代码

char * convert(char * s, int numRows){int n = strlen(s), r = numRows;if (r == 1 || r >= n) {return s;}int t = r * 2 - 2;int c = (n + t - 1) / t * (r - 1);char ** mat = (char **)malloc(sizeof(char *) * r);for (int i = 0; i < r; i++) {mat[i] = (char *)malloc(sizeof(char) * c); memset(mat[i], 0, sizeof(char) * c);                       }for (int i = 0, x = 0, y = 0; i < n; ++i) {mat[x][y] = s[i];if (i % t < r - 1) {++x; } else {--x;++y; }}int pos = 0;for (int i = 0; i < r; i++) {for (int j = 0; j < c; j++) {if(mat[i][j]) {s[pos++] = mat[i][j];}}free(mat[i]);}free(mat);return s;
}

 思路讲解


这段代码是实现了一个将字符串按照Z字形排列并重新排序的功能。以下是代码的思路讲解:
1. **功能描述**:
   该函数`convert`接收一个字符串`s`和一个整数`numRows`,将字符串`s`按照`numRows`行的方式进行Z字形排列,然后按行读取并返回重新排列后的字符串。
2. **边界条件处理**:
   - 如果`numRows`等于1,即只有一行,那么字符串不需要变换,直接返回原字符串。
   - 如果`numRows`大于或等于字符串长度`n`,同样不需要变换,直接返回原字符串。
3. **计算Z字形排列的周期**:
   - `t`表示Z字形排列的一个周期,即从第一行到最后一行再回到第一行的字符数。周期`t`的计算公式为`2 * numRows - 2`。
4. **计算矩阵的列数**:
   - `c`表示Z字形排列后形成的虚拟矩阵的列数。计算公式为`(n + t - 1) / t * (r - 1)`,这里的`r`是`numRows`的别名。
5. **初始化矩阵**:
   - 使用动态内存分配创建一个二维字符数组`mat`,行数为`numRows`,列数为`c`。每个元素初始化为0。
6. **填充矩阵**:
   - 遍历字符串`s`,将字符填充到矩阵`mat`中。使用变量`x`表示当前行,`y`表示当前列。
   - 通过`i % t`判断字符应该向下移动还是向上移动。如果`i % t < r - 1`,则向下移动(即增加行号`x`);否则,向上移动(即减少行号`x`)并增加列号`y`。
7. **按行读取矩阵**:
   - 遍历矩阵`mat`,按行读取非空字符,并重新填充到字符串`s`中。使用变量`pos`记录当前填充的位置。
8. **释放内存**:
   - 释放矩阵`mat`中每一行的内存,然后释放整个矩阵的内存。
9. **返回结果**:
   - 返回重新排列后的字符串`s`。
通过以上步骤,该代码实现了将字符串按照Z字形排列并重新排序的功能。

知识点解析

Z字形变换是一种常见的字符串处理技巧,它将一个字符串按照特定的行数进行排列,形成类似英文字母“Z”的形状。下面是对实现Z字形变换算法所需的知识点进行详细解析。
#### 1. 字符串与数组
- **字符串操作**:字符串在C语言中通常以字符数组的形式存在。操作字符串时,我们需要注意字符数组的结束符`\0`。
- **数组索引**:通过索引可以访问数组中的特定元素,这对于实现Z字形变换至关重要。
#### 2. 动态内存分配
- **malloc函数**:`malloc`用于在堆区动态分配内存空间。在Z字形变换中,我们需要为行和列分配足够的内存空间。
- **free函数**:为了避免内存泄漏,使用完动态分配的内存后,需要使用`free`函数释放内存。
#### 3. 循环与条件判断
- **for循环**:用于遍历字符串中的每个字符,以及填充和读取矩阵中的每个元素。
- **if-else条件语句**:用于判断当前字符在Z字形中的位置,以决定是向下移动还是向上移动。
#### 4. 数学计算
- **周期计算**:计算Z字形的周期`t`,它决定了字符在Z字形中的移动规律。
- **矩阵列数计算**:根据字符串长度和周期,计算Z字形变换后形成的虚拟矩阵的列数。
#### 5. 字符串与矩阵的转换
- **填充矩阵**:将字符串中的字符按照Z字形的顺序填充到二维字符数组中。
- **读取矩阵**:按照行优先的顺序读取矩阵中的字符,重新组成变换后的字符串。
#### 6. 代码优化
- **边界条件处理**:在算法开始时处理边界条件,避免不必要的计算。
- **内存初始化**:使用`memset`函数初始化矩阵,确保没有未定义的字符。
#### 7. 算法复杂度
- **时间复杂度**:算法的时间复杂度为O(n),其中n是字符串的长度,因为每个字符只需要遍历一次。
- **空间复杂度**:空间复杂度为O(n),因为需要额外的空间来存储变换后的矩阵。
 

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

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

相关文章

spring-cloud和spring-cloud-alibaba的关系

首先Spring Cloud 是什么&#xff1f; Spring Cloud是一系列框架的有序集合&#xff0c;它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发。Spring Cloud提供了微服务架构开发所需的多种组件和工具&#xff0c;如服务发现注册、配置中心、消息总线、负载均…

GA-Kmeans-Transformer-GRU时序聚类+状态识别组合模型,创新发文无忧!

GA-Kmeans-Transformer-GRU时序聚类状态识别组合模型&#xff0c;创新发文无忧&#xff01; 目录 GA-Kmeans-Transformer-GRU时序聚类状态识别组合模型&#xff0c;创新发文无忧&#xff01;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.GA-Kmeans-Transformer-GRU时…

代码随想录训练营第三十七天 完全背包问题 518零钱兑换问题II 377组合总和IV

什么是完全背包&#xff0c;就是在01背包的基础上每个物品可以放无数次&#xff0c;在代码中和01背包不一样的地方只有在遍历顺序上不一致&#xff0c;在遍历背包的顺序上 01背包是从后往前遍历&#xff0c;在完全背包中是从前往后遍历。 第一题&#xff1a; 原题链接&#x…

【Linux网络】poll{初识poll / poll接口 / poll vs select / poll开发多客户端echo服务器}

文章目录 1.初识pollpoll与select的主要联系与区别poll的原理poll的优点poll的缺点poll vs select 2.poll开发多客户端echo服务器封装套接字接口Makefile主函数日志服务聊天服务器 1.初识poll poll是Linux系统中的一个系统调用&#xff0c;它用于监控多个文件描述符&#xff08…

燃气管道老化,怎样能实时监测管网情况?

在能源管理与环境保护的交汇点上&#xff0c;一场前所未有的技术革命正在悄然兴起。随着全球对清洁能源需求的日益增长和对环境可持续性的高度重视&#xff0c;燃气作为清洁、高效、可靠的能源载体&#xff0c;其重要性不言而喻。然而&#xff0c;如何确保燃气的安全输送与使用…

新手教学系列——简单的服务配置项集中管理

前言 在开发和运维过程中,配置管理是一个非常重要但经常被忽视的环节。常用的配置文件格式包括env、ini和yaml等,它们非常适合模块级别的系统配置,尤其是一些敏感信息的配置,例如数据库连接字符串和密码等。但是,对于系统业务级别的配置,通常要求不需要重启服务即可更新…

易语言_判断循环首_循环判断首_计次循环首_变量循环首_区分-cnblog

判断循环首 如果判断条件为真&#xff0c;就进入循环条件 循环判断首 先执行一次&#xff0c;再判断循环条件 计次循环首 10为总循环次数&#xff0c;如果加i&#xff0c;i会记录当前是循环的第几次 变量循环首 变量循环首可以自定义每次循环增加的值

【Linux】文件管理常用命令【超详细】

文章目录 预防rm事故-血的教训&#x1f622;1. 使用别名&#xff1a;2. 启用回收站&#xff1a;3. 只读文件系统&#xff1a; 一、文件管理1.1 touch-文件创建1.2 rm-文件删除1.3 mkdir-目录创建1.4 rmdir-目录删除1.5 pwd-显示当前目录1.6 cd-切换当前目录1.7 ls-列出文件和目…

大模型日报 2024-07-15

大模型日报 2024-07-15 大模型资讯 Meta 开发 System 2 蒸馏技术&#xff0c;Llama 2 对话模型任务准确率接近 100% Meta 新研究提高推理任务性能。 美国启动「曼哈顿计划 2.0」&#xff0c;AI 进入奥本海默时刻&#xff1f;60 亿砸向无人机&#xff0c;已有 800 个 AI 项目 美…

【深度学习入门篇 ⑦】PyTorch池化层

【&#x1f34a;易编橙&#xff1a;一个帮助编程小伙伴少走弯路的终身成长社群&#x1f34a;】 大家好&#xff0c;我是小森( &#xfe61;ˆoˆ&#xfe61; ) &#xff01; 易编橙终身成长社群创始团队嘉宾&#xff0c;橙似锦计划领衔成员、阿里云专家博主、腾讯云内容共创官…

Home Assistant在windows环境安装

Home Assistant是什么&#xff1f; Home Assistant 是一个开源的智能家居平台&#xff0c;旨在通过集成各种智能设备和服务&#xff0c;提供一个统一的、可自定义的家庭自动化解决方案。它可以允许用户监控、控制和自动化家中的各种设备&#xff0c;包括灯光、温度、安全系统、…

02-Redis未授权访问漏洞

免责声明 本文仅限于学习讨论与技术知识的分享&#xff0c;不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;本文作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担&…

JAVA零基础小白自学日志——第十七天

文章目录 1.方法的覆写2.类的层次结构3.如何判定正确的继承顺序4.如何判断子类继承&#xff08;继承这个词我始终觉得很变扭&#xff09;了父类的什么5.继承关系的实质6.关键字&#xff1a;super 和 this[1].this关键字&#xff08;1&#xff09;this关键字调用本类属性&#x…

企业数字化转型对低代码开发平台的推动促进影响

随着企业数字化转型的浪潮日益高涨&#xff0c;低代码开发平台&#xff08;Low-Code Platform, LCP&#xff09;逐渐崭露头角&#xff0c;成为推动这一进程的重要力量。低代码开发平台以其高效、灵活和易于使用的特点&#xff0c;为企业提供了快速构建和迭代应用的能力&#xf…

IDEA快速生成项目树形结构图

下图用的IDEA工具&#xff0c;但我觉得WebStorm 应该也可以 文章目录 进入项目根目录下&#xff0c;进入cmd输入如下指令&#xff1a; 只有文件夹 tree . > list.txt 包括文件夹和文件 tree /f . > list.txt 还可以为相关包路径加上注释

掌握Python异步编程:一步一步迈向高效网络应用开发

在如今这个信息爆炸的时代&#xff0c;网络应用的需求日益增长&#xff0c;对开发效率和性能的要求也越来越高。Python作为一门流行的编程语言&#xff0c;提供了强大的异步编程功能&#xff0c;帮助开发者构建高效、响应迅速的网络应用程序。本文将带领读者一步步掌握Python异…

AI发展中的伦理挑战与应对策略

AI发展中的伦理挑战与应对策略 人工智能&#xff08;AI&#xff09;的快速发展在为社会带来许多便利和创新的同时&#xff0c;也带来了诸多伦理挑战。这些挑战主要集中在数据隐私侵犯、信息茧房的制造、歧视性算法、深度伪造技术等方面。针对这些问题&#xff0c;需要从多个层…

ROS-机械臂——从零构建机器人模型

URDF建模 URDF URDF&#xff0c;全称为 Unified Robot Description Format&#xff08;统一机器人描述格式&#xff09;&#xff0c;是一种用于描述机器人几何结构和运动学属性的标准文件格式。URDF 文件通常用于机器人模拟、路径规划、控制算法开发和可视化等领域&#xff0c…

workingset protection/detection on the anonymous LRU list

Working-set protection for anonymous pages [LWN.net] [PATCH v3 0/9] workingset protection/detection on the anonymous LRU list [LWN.net] 14.7 跟踪LRU活动情况和Refault Distance算法-CSDN博客

React学习笔记03-----手动创建和运行

一、项目创建与运行【手动】 react-scripts集成了webpack、bable、提供测试服务器 1.目录结构 public是静态目录&#xff0c;提供可以供外部直接访问的文件&#xff0c;存放不需要webpack打包的文件&#xff0c;比如静态图片、CSS、JS src存放源码 &#xff08;1&#xff09…