6_Z字形变换

news/2025/1/15 21:32:33/文章来源:https://www.cnblogs.com/zeta186012/p/18402762

6_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);
示例一:
输入:s = "PAYPALISHIRING", numRows = 3
输出:"PAHNAPLSIIGYIR"示例二:
输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P     I    N
A   L S  I G
Y A   H R
P     I示例三:
输入:s = "A", numRows = 1
输出:"A"

提示:

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

【算法设计思想】

在解决本题时,我们主要是要理解清楚本题是要我们做什么,其实笔者认为本题叫做“N字形”变换更为合适。

首先我们应该对特殊情况进行检查,如果numRows这个参数为1,那么我们什么都不需要做,直接返回s即可。

接下来我们便对一般的情况进行处理,首先我们应该要创建一个字符串变量rows,这样它可以用来存储为我们在遍历过程中的结果,长度为numRows。接着我们对字符串s进行遍历,由down变量和row变量这两个关键因素来控制我们字符要插入的位置,最后我们遍历rows这个数组,把结果放入我们的ans数组中过即可。

【算法描述】

C++:

class Solution {
public:// 定义函数convert,输入为字符串s和整数numRows,返回值类型为stringstring convert(string s, int numRows) {// 如果numRows等于1,直接返回原字符串s,因为没有改变的必要if (numRows == 1)return s;// 创建一个字符串向量rows,用于存储不同行的字符vector<string> rows(numRows);// 初始化标志位down为false,表示首先向下移动bool down = false;// 初始化变量row为0,表示从第一行开始int row = 0;// 遍历原字符串s中的每一个字符for (int i = 0; i < s.length(); i++) {// 将当前字符添加到对应的行中rows[row] += s[i];// 当到达第一行或最后一行时,改变方向if (row == 0 || row == numRows - 1)down = !down;// 根据down的值调整行号,down为true时向下移动,否则向上移动row += down ? 1 : -1;}// 初始化一个新的字符串ans来存储结果string ans = "";// 将每行的内容连接起来形成最终结果for(int i = 0; i < numRows; i++){ans += rows[i];}// 返回最终结果return ans;}
};

Java:

class Solution {public String convert(String s, int numRows) {// 如果只有一行,则直接返回原字符串,因为没有Z字形排列if (numRows == 1) {return s;}// 创建一个字符串数组,用于存储每一行的字符String[] rows = new String[numRows];// 初始化每一行为空字符串for (int i = 0; i < numRows; i++) {rows[i] = "";}// 用于控制当前遍历方向的标志位boolean down = false;// 遍历字符串中的每个字符,并根据Z字形排列规则分配到不同的行中for (int i = 0, row = 0; i < s.length(); i++) {// 将当前字符添加到对应行的字符串中rows[row] += s.charAt(i);// 如果当前行是第一行或最后一行,改变遍历方向if (row == 0 || row == numRows - 1) {down = !down;}// 根据方向(向下或向上)调整当前行数row += down ? 1 : -1;}// 初始化结果字符串String ans = "";// 将所有行的字符串依次拼接到结果字符串中for (int i = 0; i < numRows; i++) {ans += rows[i];}// 返回最终拼接的字符串,即完成Z字形排列的字符串return ans;}
}

Python:

class Solution:def convert(self, s: str, numRows: int) -> str:# 如果只有一行,Z字形排列等于原字符串,直接返回if numRows == 1:return s# 创建一个列表,每个元素初始化为空字符串,用于存储每一行的字符rows = [""] * numRowsrow = 0  # 当前行的索引down = False  # 控制字符流动的方向(向下或向上)# 遍历字符串中的每个字符for i in range(len(s)):# 将字符添加到当前行rows[row] += s[i]# 如果当前行是第一行或最后一行,改变方向if row == 0 or row == numRows - 1:down = not down# 根据当前方向,更新行索引if down:row += 1  # 向下移动else:row -= 1  # 向上移动# 将所有行的字符串连接成最终的结果ans = ""for i in range(numRows):ans += rows[i]return ans

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

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

相关文章

VS Code 快速输入代码

VS Code 快速输入代码: HTML 代码只输入 ! ,按Enter,这将自动生成一个基本的HTML骨架代码,例如: 快速输入特定的HTML标签,可以使用Emmet插件,它是VS Code的一个扩展,可以通过简短的指令生成复杂的HTML结构。 输入div,按Enter输入div*4,按Enter 例如,输入 ul>li…

微信小程序开发系列4----页面配置--WXML列表渲染

小程序布局-WXML列表渲染 源码获取方式(免费):(1)登录-注册:http://resources.kittytiger.cn/(2)签到获取积分(3)搜索:微信小程序开发2-wxmllist列表渲染

微信小程序开发系列3----页面配置--WXML数据绑定+条件渲染

1小程序布局-WXML数据绑定 有的时候发现需要刷新一下全局的app.js才能有效果。。。。。 2小程序布局-WXML条件渲染 下图会报错:不能在if else 中间插入其他的标签 如下展示一次渲染多个标签使用block 源码获取方式(免费):(1)登录-注册:http://resources.kittytiger.c…

[C++ Daily] 虚表与虚指针的理解

虚表与虚指针的理解结果:

微信小程序开发系列1----账号注册、开发工具下载、小程序代码结构

一、注册小程序账号 url:https://mp.weixin.qq.com/cgi-bin/wx?lang=zh_CN&token= 注册后获取 AppID(小程序ID) 和 AppSecret(小程序密钥)二、微信小程序工具下载 https://developers.weixin.qq.com/miniprogram/dev/devtools/download.html官网文档:https://developers…

可测试,可维护,可移植:上位机软件分层设计的重要性

从三个方面论述了上位机软件分层设计的必要。互联网中,软件工程师岗位会分前端工程师,后端工程师。这是由于互联网软件规模庞大,从业人员众多。前后端分别根据各自需求发展不一样的技术栈。那么上位机软件呢?它规模小,通常一个人就能开发一个项目。它还有必要分前后端吗?…

【漏洞分享】2018年-2024年HVV 6000+个漏洞 POC 合集分享

此份poc 集成了Zabbix、用友、通达、Wordpress、Thinkcmf、Weblogic、Tomcat等 下载链接: 链接: https://pan.quark.cn/s/1cd7d8607b8a看着就真的看着,不学就真的5

【工具推荐】FindEverything(最新版) - 内网渗透必备 敏感文件搜索工具

工具介绍 内网渗透过程中搜寻指定文件内容,从而找到突破口的一个小工具 下载链接: 链接: https://pan.quark.cn/s/067a43165790使用说明 python3 FindEverything.py -n .txt,.ini,.yaml,.php,.jsp,.java,.xml,.sql -c "password=" -d D:/ python3 FindEverything.p…

不可不知的WPF几何图形(Geometry)

在软件行业,经常会听到一句话“文不如表,表不如图”说明了图形在软件应用中的重要性。同样在WPF开发中,为了程序美观或者业务需要,经常会用到各种个样的图形。今天以一些简单的小例子,简述WPF开发中几何图形(Geometry)相关内容,仅供学习分享使用,如有不足之处,还请指…

[Spring]MyBatis的执行原理

MyBatis的执行原理详细介绍 为了使大家能够更加清晰的理解MyBatis程序,在正式讲解MyBatis入门案例之前,先来了解一下MyBatis程序的工作原理,如图1所示。 MyBatis的工作原理从图1可以看出,MyBatis框架在操作数据库时,大体经过了8个步骤。下面就对图1中的每一步流程进行详细…

逐月信息学——2024初秋集训——提高组 #22

A. 牛牛的方程式 题目描述 给定一个三元一次方程 \(ax+by+cz=d\),求该方程是否存在整数解。 思路 由于若干个 \(a,b,c\) 只能凑出 \(\gcd (a,b,c)\) 的倍数,所以只需判断 \(d\) 是否为 \(\gcd(a,b,c)\) 的倍数即可。特别的,若 \(a,b,c\) 均为 \(0\),则显然只有 \(d=0\) 时存…

在VScode-SSH中Rust工程不能代码间跳转的原因

今天正常使用VScode-SSH访问虚拟机,但是发现读代码的时候不能使用ctrl+左键的方式跳转,然后看到Rust-Analyzer(VScode的Rust语言插件)报错. 2024-09-08T02:25:28.998500Z ERROR failed to find any projects in [AbsPathBuf("/home/winddevil/App")] 2024-09-08T02:2…