Leetcode:Z 字形变换

题目链接:6. Z 字形变换 - 力扣(LeetCode)

普通版本(二维矩阵的直接读写)

解决办法:直接依据题目要求新建并填写一个二维数组,最后再将该二维数组中的有效字符按从左到右、从上到下的顺序读取并放到新数组中 

分析1:当我们在矩阵上填写字符时,会先向下填写 r 个字符,然后向右上继续填写 r−2 个字符,最后回到第一行

结论1:Z 字形变换的周期 t = r + r − 2 = 2r − 2(一个残缺的斜着的v),每个周期会占用矩阵上的1 + (r - 2)= r − 1列

结论2:总周期数 = n(总字符数)/  t(向上取整)总列数c = (n / t) * (r - 1)

结论3:新建二维数组的行数为r,列数为c

填写操作:设当前填写的位置为(x,y),即矩阵的第 x 行的第 y 列,初始 (x,y)=(0,0)(矩阵左上角)若当前字符下标 i 满足 i  mod  t < r − 1,则向下移动,否则向右上移动

class Solution {
public:string convert(string s, int numRows) {int n = s.length(), r = numRows;if (r == 1 || r >= n) {return s;}int t = r * 2 - 2;//一个周期中的个数//一个周期中的列数 = (r - 1)int c = (n + t) / t * (r - 1);//总列数 = 周期个数 * 一个周期的列数,周期个数 =  总个数 / 一个周期中的个数//如果总个数只是单纯的n的话,可能会导致不满一个周期的字符不被计算在内,且不被算在内的情况有多1、2、3个三种情况//而我们只需要在一个完整的总个数中再加上一个周期的个数即可,这样就可以将多出来的元素也算入一个新周期,尽管可能有空位但无所谓了vector<string> mat(r, string(c, 0));//创建一个r行、每行长度为c(即c列)的二维字符串数组mat,并初始化每个位置的字符为0for (int i = 0, x = 0, y = 0; i < n; ++i) //先从二维数组的左上角开始填写,先填写后判断下一次要填写的方向{//因为是先插入后判断的,所以判断时已经插入一个了,因此能继续向下移动的次数为r-1次mat[x][y] = s[i];if (i % t  < r - 1 ) //下标i是逐渐递增,因此要%t,重新映射原字符串中下标为i的字符在新周期中的位置(相当于在新周期中已经走了几次了){//已经走的次数要小于该周期中向下可以走的次数-1,否则就是向右上走++x; // 向下移动} else{   --x;++y; // 向右上移动}}string ans;//遍历二维数组,将非空的位置的字符插入新stringfor (auto &row : mat) {for (char ch : row) {if (ch) {ans += ch;}}}return ans;}
};

时间复杂度:O(N)(创建数组的时间复杂度为O(r * c),填充数组的时间复杂度为O(N),构造最最终结果的时间复杂度为O(r * c),由于 r * cn 都是输入规模 n 的线性函数,我们可以认为时间复杂度是 O(n))

空间复杂度:O(N)string ans 用来存储结果字符串,占用了 O(n) 的空间

优化版本(压缩矩阵空间,待补充)

优化版本(直接构造,待补充)

~over~

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

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

相关文章

umijs+react+ts项目代码一片红处处报错解决

报错问题现象 1、在没有 "node" 模块解析策略的情况下&#xff0c;无法指定选项 "-resolveJsonModule"。 2、类型“JSX.IntrinsicElements”上不存在属性“div”。 解决办法 试了很多都没用&#xff0c;最后是参考这位朋友的解决了 vitevue3搭建工程标…

一个HL7的模拟工具

这个模拟器是为了过&#xff08; NIST美国国家标准与技术研究院&#xff08;National Institute of Standards and Technology&#xff0c;NIST&#xff09;的电子病历住院部分的认证而写的。 用途说明 inpatient中的lab order信息通过该工具向实验室转发该信息。并将实验室…

cesium学习6-相机camera

视角设置 viewer.camera.setView({destination:Cesium.Cartesian3.fromDegrees(118.0658439,24.5915414,2500),//目的地orientation:{heading:Cesium.Math.toDegrees(0),//左右平移0pitch:Cesium.Math.toDegrees(90),//上下点头90roll:Cesium.Math.toDegrees(0),//歪头0}}) 相机…

解析Java中1000个常用类:Deprecated类,你学会了吗?

在 Java 编程中,随着技术的发展和代码库的演进,旧的方法、类或接口可能会逐渐被新的替代方案取代。为了管理这些过时的代码,Java 提供了 @Deprecated 注解。 本文将深入探讨 @Deprecated 注解的功能、用法、实际应用中的注意事项,以及如何有效地管理和替换过时的代码。 @…

linux-gpio

在Linux shell中测试GPIO通信&#xff0c;通常需要使用GPIO的设备文件&#xff0c;这些文件通常位于/sys/class/gpio目录下。要使用特定的GPIO引脚&#xff0c;比如GPIO92&#xff0c;你需要执行以下步骤&#xff1a; 导出GPIO引脚&#xff1a;首先&#xff0c;需要确保GPIO92已…

Window系统安装Docker

因为docker只适合在liunx系统上运行&#xff0c;如果在window上安装的话&#xff0c;就需要开启window的虚拟化&#xff0c;打开控制面板&#xff0c;点击程序&#xff0c;在程序和功能中可以看到启动和关闭window功能&#xff0c;点开后&#xff0c;找到Hyper-V&#xff0c;Wi…

堆排序-普通建堆与线性建堆的比较

前言 个人小记 一、代码如下 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #define MAX_COUNT 100000000 #define father(i) ((i)/2) #define left(i) ((i)*2) #define right(i) ((i)*2)1 #define TEST(func,a…

centos 7 编译安装 php-8.2.19

1.、安装编译工具及库文件&#xff08;使用yum命令安装&#xff09; yum install -y apr* autoconf automake bison bzip2 bzip2* cloog-ppl cpp curl curl-devel fontconfig fontconfig-devel freetype freetype* freetype-devel gcc gcc-c gtk-devel gd gettext gettext-de…

Vue3实战笔记(55)—Vue3.4新特性揭秘:defineModel重塑v-model,拥抱高效双向数据流!

文章目录 前言defineModel() 基本用法总结 前言 v-model 可以在组件上使用以实现双向绑定。 从 Vue 3.4 开始&#xff0c;推荐的实现方式是使用 defineModel() 宏 defineModel() 基本用法 定义defineModel()&#xff1a; <!-- Child.vue --> <script setup> con…

Conditional DETR解读---带anchor的DETR

DETR存在的问题 1.收敛速度慢 2.对小目标物体检测效果不好&#xff0c;因为transformer计算量大&#xff0c;受限于计算规模&#xff0c;CNN提取特征时只采取了最后一层特征&#xff0c;没有用FPN等结构。所以对于小目标检测效果不好。 论文主要观点 通过对DETRdecoder中的a…

华为昇腾910B性能及应用场景

华为昇腾910B是一款高性能的人工智能处理器芯片&#xff0c;以下是其性能参数及应用的相关信息&#xff1a; 一、性能参数 制造工艺&#xff1a;昇腾910B采用了先进的7nm工艺制程&#xff0c;确保了其高效能低功耗的特性。核心数量&#xff1a;集成了数千个处理核心&#xff…

【退役之Java面试经历】第一次面试记录和复盘, Action!

一、简历 两段工作经历&#xff0c;四个项目 二、面试 技术面试 总体还行&#xff0c;关于 redis 和 rabbitmq 以及 spring boot&#xff0c;spring cloud 的知识&#xff0c;回答得还可以。但是&#xff0c;还问到了 “单点登录”、“撰写需求分析文档和操作手册”等盲点。…

代码随想录训练营Day 45|力扣1049. 最后一块石头的重量 II、494. 目标和、474.一和零

1.最后一块石头的重量2 视频讲解&#xff1a;动态规划之背包问题&#xff0c;这个背包最多能装多少&#xff1f;LeetCode&#xff1a;1049.最后一块石头的重量II_哔哩哔哩_bilibili 代码随想录 代码&#xff1a; class Solution { public:int lastStoneWeightII(vector<int…

芋道系统,springboot+vue3+mysql实现地址的存储与显示

1.效果图 2.前端实现&#xff1a; <el-form-item label"地址" prop"entrepriseAddress"><el-cascaderv-model"formData.entrepriseAddress"size"large":options"region"/></el-form-item> //导入组件 im…

k8s中pod如何排错?

排除Kubernetes Pod故障通常涉及一系列步骤&#xff0c;以诊断问题并找到解决方案。以下是一些常见的故障排除方法&#xff1a; 检查Pod状态: 使用kubectl get pods查看Pod的状态。如果Pod没有处于Running状态&#xff0c;查看更详细的信息&#xff0c;使用kubectl describe …

【JMeter接口自动化】第7讲 Jmeter三个重要组件

线程组:是JMeter中最基本的元素之一&#xff0c;用于模拟并发用户访问目标系统。线程组定义了测试计划中的用户数量、用户行为和用户请求之间的关系。 添加方法:测试计划->添加->线程(用户)->线程组 在线程组中&#xff0c;您可以设置以下参数&#xff1a; 线程数&a…

一种改进的形态学滤波算法-以心电信号的基线校正和噪声抑制为例(MATLAB环境)

信号在釆集和传输过程中难免受到噪声源的干扰&#xff0c;反映非线性动力学行为的特征信息有可能被噪声所掩盖。尤其是在混沌振动信号噪声抑制方面&#xff0c;因为混沌信号的高度非线性及宽频特性&#xff0c;噪声和混沌信号往往具有重叠的带宽。传统的时域及频域降噪方法效果…

高通Android 12/Android 13截屏

正常截屏Power音量-键 组合键同时长按&#xff0c;实现截屏逻辑。 PhoneWindowManager #init #interceptScreenshotChord init(Context context, IWindowManager windowManager,WindowManagerFuncs windowManagerFuncs) 2、在PhoneWindowManager中init方法中注册广播 framew…

神经网络-------人工神经网络

一、什么是神经网络和神经元 人工神经网络&#xff08;英语&#xff1a;Artificial Neural Network&#xff0c;ANN&#xff09;&#xff0c;简称 神经网络&#xff08;Neural Network&#xff0c;NN&#xff09;或 类神经网络&#xff0c;是一种模仿生物神经网络&#xff08;…