当前位置: 首页 > news >正文

【算法】模拟:(leetcode)6.Z 字形变换(medium)

目录

 题目链接

题目介绍

 解法

1、模拟:

2、找矩阵中的规律:

公差

第一行和最后一行

中间行 

 代码


 题目链接

6. Z 字形变换 - 力扣(LeetCode)

题目介绍

 解法

1、模拟:

采用模拟的思想,按照Z字形,把原先的字符串直接依次填充在矩阵中(numRows行,s.size()为大小的列数。字符串长度最大为1000,数据量也不是很大)

2、找矩阵中的规律:

仅仅依靠模拟,完成题目,任务量有点大。

所以我们把字符串对应的下标直接填入到二维矩阵中,观察下标的变化规律。

直接看图:

公差

 通过多次列举不同行数的Z字形的字符串,可以得到公差的规律:

2*numRows-2

第一行和最后一行

然后我们利用公差,对于每一行进行观察。

可以发现对于第一行和最后一行,他们的下标变化是类似的。因此我们直接只观察第一行。


观察第一行:

其中 i 是行数,d 是公差 

中间行 

观察其余行(除去第一行、最后一行)

在这里,以第二行为例:


可以看到,以上规律适用于Z字形全部被填满的情况下。

一旦出现以下的情况,就需要在考虑越界的情况。 

 代码

class Solution {
public:string convert(string s, int numRows) {//只有一行if (numRows == 1)return s;string ret;//规律:公差 = 2(n-1)int d = 2 * (numRows - 1);int n = s.size();//第一行//因为第一行的下标是,原字符串中的最后一个//所以范围是[0,n)for (int i = 0; i < n; i += d){ret.push_back(s[i]);}//中间行//中间行是从第2行开始,下标为1,//截止到倒数第二行,下标为numsRows-1for (int i = 1; i < numRows - 1; i++){for (int j = i, next = d - i; j < n || next < n; j += d, next += d){//next用于求,处于对角线的数//因为有时只存在对角线,后面就没有数了,next会发生越界if (j < n) ret.push_back(s[j]);if (next < n) ret.push_back(s[next]);}}//最后一行for (int i = numRows - 1; i < n; i += d){ret.push_back(s[i]);}return ret;}
};


http://www.mrgr.cn/news/35510.html

相关文章:

  • 光子架与电子架 -- 主从子架
  • 小程序面板开发教程|开发照明 Matter 面板步骤(一)
  • WebGL阴影与后期处理
  • Taro多端统一开发解决方案
  • 多线程:死锁
  • 从 Oracle 集群到单节点环境(详细记录一次数据迁移过程)之二:生产服务器的备份操作
  • 前端读取PDF和DOCX文件(干货分享)
  • 【C++】Eclipse技巧汇总
  • ATTCK实战系列-Vulnstack靶场内网域渗透(二)
  • [docker][软件]docker快速安装rabbitmq
  • 每日一练:二叉树的层序遍历
  • 并发编程。
  • 【学习复盘】相关资料
  • QT 自定义可拖动缩放的无边框窗口,可用于mainmindow, widget
  • WebGL性能分析与优化
  • 24/9/24 算法笔记 超参数优化算法
  • QT客户端发送HTTP请求此时服务器到底收到了哪些数据?
  • 解决Mac 默认设置 wps不能双面打印的问题
  • yum库 docker的小白安装教程(附部分问题及其解决方案)
  • 翻译:openmax文档