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

LeeCode [N字形变换]算法解析

关键字:数学归纳法

一、题目

将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:

P   A   H   N
A P L S I I G
Y   I   R

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,

比如:"PAHNAPLSIIGYIR"

请你实现这个将字符串进行指定行数变换的函数:

convert(s, 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"

二、思路:使用数学归纳法对Z字形排列进行规律总结

// 3阶Z变形 7个1

// 1    1

// 1 1 1

// 1    1

// 4阶Z变形 10个1

// 1         1

// 1     1  1

// 1  1     1

// 1         1

// 5阶Z变形 13个1

// 1            1

// 1        1  1 

// 1     1     1 

// 1  1        1 

// 1            1

// ........

// n阶Z变形

// 得到公式,n阶:3n-2个1,3n - 2 = n + (n-2) + n

经过以上归纳,我们知道了对于Z字变形的一个数学上的规律,这里的n就是题目中的numRows变量。同时从图形上看,我们可以把一个V形看成一个周期(如下图,表示3个周期),确定这个思想有利于理解后面的逻辑。

1            1             1

1        1  1         1  1        1

1     1     1      1     1     1

1  1        1   1        1   1

1            1             1

三、现在我们知道了这样一个规律,那么我们很容易想到把字符串按照这样的规律放进到一个二维数组里面,所以,我们需要基于我们发现的规律来分析出两个关键点:

  • 二维数组的行列数
  • 每一个字符在二维数组中的位置

四、实现步骤

1、定义一个二维数组,二维数组为arr[n-1][m-1],n为行数,m为列数,s为字符串

m = (Math.floor(s.length / (2n-2)))*(n-1) + (s.length % (2n-2)-n>0?(n-2)+1:(s.length % (2n-2) === 0?0:1);这里把(n + (n-2))看成一个周期

// 粗略一点的话,m也可以直接等于 Math.ceil(s.length/(2n - 2))*(n-1)

2、每个字符在二维数组中的位置(同样用到了数学归纳法)

 假设字符的索引为i:

所在列:col = (Math.floor((i+1) / (2n-2)))*(n-1) + ((i+1) % (2n-2)-n>0?(n-2)+1:((i+1) % (2n-2) === 0?0:1)

所在行:row = (i+1)%(2n-2) <=n?((i+1)%(2n-2)===0?2:(i+1)%(2n-2)):2n-(i+1)%(2n-2) 

3、 遍历字符串,把每个字符放在对应的位置上

4、再按行,从左到右取字符

五、完整代码

let convert = function(s,numRows = 3){let n = numRows;let len = s.length;let m = 0let arr = new Array(n);if(len < (3 * numRows - 2)){return s}m = (Math.floor(len/(2*n-2)))*(n-1)let remainder = len%(2*n-2)if(remainder !== 0){m += (remainder - n > 0?(n-2)+1:1)}for(let i = 0;i < n;i++){arr[i] = new Array(m);}// 遍历字符串for(let i = 0;i < len;i++){let remainder1 = (i+1)%(2*n-2)let col = (Math.floor((i+1)/(2*n-2)))*(n-1) + (remainder1-n>0?(n-2)+1:(remainder1 === 0?0:1))col = col -1 // 从0列开始let row = remainder1 <= n?remainder1:2*n-remainder1if(remainder1 === 0){row = 2}row = row - 1 // 从0行开始arr[row][col] = s[i]}// 按行从左向右取字符串let result = '';for(let i = 0;i < n;i++){for(let j = 0;j < m;j++){if(arr[i][j]){result += arr[i][j]}}}console.log(arr)console.log(result)
}
convert("PAYPALISHIRING",3) //输出:PAHNAPLSIIGYIR
convert("PAYPALISHIRING",4) //输出:PINALSIGYAHRPI

相关文章:

LeeCode [N字形变换]算法解析

关键字&#xff1a;数学归纳法 一、题目 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff1a; P A H N A P L S I I G Y I R …...

CPU性能提升:流水线

一条指令的执行一般要经过取指令&#xff0c;翻译指令&#xff0c;执行指令3个基本流程。CPU内部的电路分为不同的单元&#xff0c;取指但愿&#xff0c;译码单元&#xff0c;执行单元等。指令的执行也是按照流水线工序一步步执行的。如图2-34所示&#xff0c;我们假设每一个步…...

C语言指针初级

目录 一、什么是指针 二、指针和指针类型 三、野指针 1.野指针的成因&#xff1a; 2.如何规避野指针 四、指针运算 1.指针-整数 2. 指针之间的加减 五、二级指针 六、指针数组 一个男人&#xff0c;到底要走多少的路&#xff0c;才能成为一个真正的男人 本专栏适用于…...

C++的历史

C是一种广泛使用的编程语言。C于1983年由丹尼斯里奇&#xff08;Dennis Ritchie&#xff09;在贝尔实验室创造&#xff0c;它是C语言的扩展。C的设计初衷是为了提高代码的可重用性和可维护性。它允许开发人员使用面向对象编程&#xff08;OOP&#xff09;范例&#xff0c;这使得…...

保姆级别!!!--全网绝对教你会!!教你如何使用MQTTFX连接阿里云平台中的设备----下期告诉你如何创建!

本期需要下载的软件 MQttfx安装包&#xff0c;本人打包的-嵌入式文档类资源-CSDN文库 目录 第一步&#xff1a;建造阿里云设备 这个可以先忽略建造步骤&#xff0c;下期将提供步骤。 第二步&#xff1a;下载mqttfx软件 第三步&#xff1a;填写密钥信息进行连接 查看三元…...

Unexpected token ‘‘‘, “‘{“type“:““... is not valid JSON

尝试低代码schema解析JSON时报错,奇怪的是控制台解析正常,项目js执行JSON.parse()报错,简直无语了,,, 只能挨个检查了,首先温习了下JSON 的标准格式: JSON的合法符号:{(左大括号) }(右大括号) "(双引号) :(冒号) ,(逗号) [(左中括号) ](右中括号) JSON字符串:…...

关于C语言的杂记5

文章目录 引入正文内部函数与外部函数相关数组的知识点数组的初始化测试一维数组在内存中存储的地址&#xff1a;遍历二维数组的值测试二维数组的地址(观察内存情况)数组下标为0开始的由来 两个数交换位置的三种方法 引入 写在前面&#xff1a;关于C语言这部分内容&#xff0c;…...

YOLOv5 vs YOLOv6 vs YOLOv7目标检测模型速度和准确度的性能比较——深入研究

如果您正在进行目标检测项目,您很可能会选择众多 YOLO 模型中的一种。从现有的 YOLO 对象检测模型的数量来看,如何选择最佳模型是一个艰难的选择。 您可能会发现自己正在考虑: 选择哪种 YOLO 模型以获得最佳 FPS? CPU 与 GPU 的推理速度如何?选择哪种 GPU?微型、小型、…...

如何增加网站权重?有效提高网站权重的技巧方法

权重对于网站优化来说非常的重要&#xff0c;那什么是网站权重呢&#xff1f;网站权重是指搜索引擎给网站&#xff08;包括网页&#xff09;赋予一定的权威值&#xff0c;对网站&#xff08;含网页&#xff09;权威的评估评价。一个网站权重越高&#xff0c;在搜索引擎所占的份…...

路径规划 | 图解快速随机扩展树RRT算法(附ROS C++/Python/Matlab仿真)

目录 0 专栏介绍1 什么是RRT算法?2 图解RRT算法原理3 算法仿真与实现3.1 ROS C++实现3.2 Python实现3.3 Matlab实现0 专栏介绍 🔥附C++/Python/Matlab全套代码🔥课程设计、毕业设计、创新竞赛必备!详细介绍全局规划(图搜索、采样法、智能算法等);局部规划(DWA、APF等);…...

【Stable Diffusion WebUI】一篇文章教你如何安装和使用Stable Diffusion WebUI

文章目录 Stable Diffusion WebUI1. 安装1.1 下载 stable-diffusion-webui1.2 运行 webui.sh 2. 安装插件2.1 命令行安装2.2 extensions 安装2.3 常用插件 3. 使用教程3.1 页面布局3.3 快捷栏设置3.3.1 PNG Info3.3.2 Tagger Stable Diffusion WebUI 1. 安装 1.1 下载 stable…...

Python篇——数据结构与算法(第二部分)

目录 二、排序算法&#xff08;承接第一部分&#xff09; 1、堆排序算法——树的基础知识补充 2、树的基本概念 3、二叉树基础知识 &#xff08;1&#xff09;满二叉树 &#xff08;2&#xff09;完全二叉树 &#xff08;3&#xff09;二叉树的存储方式&#xff08;表示方式…...

人工智能之读懂CNN卷积神经网络

通过往期文章的分享,我们了解了神经网络的结构,一般分为输入层,隐藏层,输出层 TensorFlow神经网络 那什么是卷积神经网络那,这就要我们追溯一下人类识别图像的原理 人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现…...

go手写Redis(1)之协议说明

手写Redis 参考大佬的go实现redis&#xff0c;自己实现一个简单版本的用于学习go以及网络编程相关 https://github.com/HDT3213/godis https://coding.imooc.com/class/576.html #慕课网课程 源码地址&#xff1a; https://gitee.com/haijun1998/go_redis RESP协议 Redis Ser…...

Hadoop/HbBase/Hive/HDFS/MapReduce都是什么?

目录 一图胜万言&#xff01;&#xff01; 解释说明 1. hadoop 2. hive 3. hbase 总结 一图胜万言&#xff01;&#xff01; 解释说明 1. hadoop 它是一个分布式计算分布式文件系统&#xff0c;前者其实就是 MapReduce&#xff0c;后者是 HDFS 。后者可以独立运行&…...

羽毛球中级提高班课后总结

2023.3.28第一课 &#x1f3f8;️四点对角线步伐练习&#x1f3f8;️ 1️⃣每一次接球一定要有启动步&#xff0c;脚跟离地&#xff1b; 2️⃣两边上网都是先迈右腿&#xff0c;加一个并步&#xff0c;最后一步大迈步&#xff0c;脚跟先落地&#xff1b; 3️⃣右边上网脚尖朝…...

多维时序预测 | Matlab基于最小二乘支持向量机LSSVM多维时间序列预测,LSSVM多变量时间序列预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 基于最小二乘支持向量机LSSVM多维时间序列预测LSSVM多变量时间序列预测,matlab代码 评价指标包括:MAPE、MAE、RMSE和R2等,代码质量极高,...

KDZK-F水轮发电机转子测试仪

一、产品概述 KDZK-F水轮发电机转子测试仪是判断发电机转子绕组有无匝间短路的专用仪器&#xff0c;可以自动、手动&#xff08;单向或双向&#xff09;测量转子绕组的电压、电流、阻抗、功率、相位角等参数。 二、功能与特点 旋转鼠标&#xff0c;操作更方便。 可选择快速的…...

I2C通信协议原理和MPU6050

一、串口通讯 只能在两个设备之间进行 若要三台设备两两通信&#xff0c;则每个设备得需要两组窗口&#xff0c;为3组相互独立的窗口通讯 为解决这个问题&#xff1a;设计了总线通讯&#xff0c;有多种&#xff0c;I2C为其中一种 二、I2C通信 &#xff08;1&#…...

3.5 RDD持久化机制

一、RDD持久化 1、不采用持久化操作 查看要操作的HDFS文件 以集群模式启动Spark Shell 按照图示进行操作&#xff0c;得RDD4和RDD5 查看RDD4内容&#xff0c;会从RDD1到RDD2到RDD3到RDD4跑一趟 显示RDD5内容&#xff0c;也会从RDD1到RDD2到RDD3到RDD5跑一趟 2、采用持久化…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

【无标题】路径问题的革命性重构:基于二维拓扑收缩色动力学模型的零点隧穿理论

路径问题的革命性重构&#xff1a;基于二维拓扑收缩色动力学模型的零点隧穿理论 一、传统路径模型的根本缺陷 在经典正方形路径问题中&#xff08;图1&#xff09;&#xff1a; mermaid graph LR A((A)) --- B((B)) B --- C((C)) C --- D((D)) D --- A A -.- C[无直接路径] B -…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...

DeepSeek越强,Kimi越慌?

被DeepSeek吊打的Kimi&#xff0c;还有多少人在用&#xff1f; 去年&#xff0c;月之暗面创始人杨植麟别提有多风光了。90后清华学霸&#xff0c;国产大模型六小虎之一&#xff0c;手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水&#xff0c;单月光是投流就花费2个亿。 疯…...

【java】【服务器】线程上下文丢失 是指什么

目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失&#xff1f; 直观示例说明 为什么上下文如此重要&#xff1f; 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程&#xff0c;代码应该如何实现 推荐方案&#xff1a;使用 ManagedE…...

GeoServer发布PostgreSQL图层后WFS查询无主键字段

在使用 GeoServer&#xff08;版本 2.22.2&#xff09; 发布 PostgreSQL&#xff08;PostGIS&#xff09;中的表为地图服务时&#xff0c;常常会遇到一个小问题&#xff1a; WFS 查询中&#xff0c;主键字段&#xff08;如 id&#xff09;莫名其妙地消失了&#xff01; 即使你在…...

【阅读笔记】MemOS: 大语言模型内存增强生成操作系统

核心速览 研究背景 ​​研究问题​​&#xff1a;这篇文章要解决的问题是当前大型语言模型&#xff08;LLMs&#xff09;在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色&#xff0c;但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成&#xff08;RA…...