力扣6:N字形变化

news/2025/2/14 7:19:53/

代码:

class Solution {
public:string convert(string s, int numRows){int len=s.size();if(numRows==1){return s;}int d=2*numRows-2;int count=0;string ret;//第一行!for(int i=0;i<len;i+=d){ret+=s[i];}//第k行!for(int i=1;i<numRows-1;i++){for(int j=i,k=d-j;j<len||k<len;j+=d,k+=d){if(j<len){ret+=s[j];}if(k<len){ret+=s[k];}}}//最后一行!for(int i=numRows-1;i<len;i+=d){ret+=s[i];}return ret;}
};

算法思路:

本题可以通过暴力的解法进行求解!即定义一个numsRows行,len列的数组!然后依次根据规律进行将数组元素填置,此时的空间/时间复杂度为O(numsRows*len);

那么是否可以进行优化呢?

答案是肯定的,我们可以通过上图发现一个规律,第i的第一个元素都是i,然后第一行和最后一行有着相同的规律,每隔一个固定的值,会出现一个元素!那么如何求出这个固定的值呢?通过将numsRows我们不难发现!只需要将2*numsRows-2即可求出这个固定的值,我们称之为公差!

为什么是这种求法呢?我们可以将其中间只有一个元素的统一移到第二列,第二列并没有填满,而是只缺少了第一行和最后一行,所以我们不难得到公差d=2*numsRows-2!

所以第一行和最后一行的规律如下:

i---->i+d----->i+2d---.......(直至值大于等于len结束!)

既然第一行和最后一行都发现了规律,那么中间行是否也有规律呢?通过仔细发现,中间行确实也有规律所循!即中间行的第一个元素都和所在行数相同,第二个元素是d-i,这是一组元素!然后每组元素都向后移动的距离仍然还是d! 直接当下标小于原字符串的长度时候结束!

所以第k行的元素有着以下的规律:

(i,d-i)---->(i+d,d-i+d)---->(i+2d,d-1+2d)   直至值大于等于len结束!

还需要注意的边界问题有:当给定的numRows为1!需要直接返回原字符串! 否则就会导致死循环的发生!


http://www.ppmy.cn/news/1245426.html

相关文章

电脑热点无法使用,分配IP地址失败

电脑热点无法使用&#xff0c;分配IP地址失败 不知道从什么时候起电脑开热点就无法连接上了&#xff0c;手机提示无法分配IP地址&#xff0c;电脑正常显示。 设置共享网络连接时提示以下内容。 无法启用internet连接共享,为LAN连接配置的IP地址需要使用自动IP寻址 查阅相关资…

Java - Stream Filter 多条件筛选过滤

Java Stream流中Filter用于通过设置的条件过滤出元素 &#xff0c;示例如下&#xff1a; List strings Arrays.asList(“abc”, “”, “bc”, “efg”, “abcd”,"", “jkl”);List filtered strings.stream().filter(string -> !string.isEmpty()).collect(C…

MYSQL基础知识之【修改数据,删除数据】

文章目录 前言MySQL UPDATE 查询使用PHP脚本更新数据 MySQL DELETE 语句从命令行中删除数据使用 PHP 脚本删除数据 后言 前言 hello world欢迎来到前端的新世界 &#x1f61c;当前文章系列专栏&#xff1a;Mysql &#x1f431;‍&#x1f453;博主在前端领域还有很多知识和技术…

JBase到JRT

JBase之前是站在之前基础上新做的java框架。所以带入一些老的历史习惯&#xff0c;比如库和空间都以LIS开头&#xff0c;实体只能是LIS.Model等。为了做到更通用的框架&#xff0c;需要剔除LIS特性&#xff0c;实体肯定不能只能叫LIS.Model了。同时之前只关注业务脚本化的事忘了…

wireshark 抓包提示

[TCP Previous segment not captured] 在TCP的传输阶段&#xff0c;同一台主机发出的数据段应该是连续的&#xff0c;即后一个包的Seq等于前一个包的SeqLen&#xff08;三次握手和四次挥手是个例外&#xff09;。如果wireshark发现后一个包的Seq号大于前一个包的SeqLen&#xf…

STL: 容器适配器stack 与 queue

目录 1.容器适配器 1.1 STL标准库中stack和queue的底层结构 1.2 deque的简单介绍(了解) 1.2.1 deque的原理介绍 1.2.2 deque的缺陷 1.2.3 为什么选择deque作为stack和queue的底层默认容器 2. stack的介绍和使用 2.1 stack的介绍 2.2 stack的使用 2.3 利用deque模拟实现…

springboot 返回problem+json

spring所有配置都在WebMvcAutoConfiguration中 其中有 ProblemDetailsExceptionHandler 容器中的一个组件 -ControllerAdvice用来集中处理异常的 -点进ResponseEntityExceptionHandler 包含这些异常&#xff0c;如果出现以下异常&#xff0c;会被springboot支持以RFC 7807规…

你了解Redis 的二进制安全吗

最近面试的时候被问到Redis 的二进制安全相关八股文面试题。Redis二进制安全内容比较多&#xff0c;以下是简单的总结大致的过程&#xff0c;需要深入学习的建议跳过 Redis是基于C语言进行开发的&#xff0c;而C语言中的字符串是二进制不安全的&#xff0c;所以Redis就没有直接…