LeetCode:6. N 字形变换

news2024/11/25 1:24:34
🍎道阻且长,行则将至。🍓

🌻算法,不如说它是一种思考方式🍀


算法专栏: 👉🏻123

题解目录

  • 一、🌱[6. N 字形变换](https://leetcode.cn/problems/zigzag-conversion/)
    • 🌴解题
      • 1.构造N字形状数组
      • 2.构造序号数组
      • 3.直接用数组



明明自觉学会了不少知识,可真正开始做题时,却还是出现了“一支笔,一双手,一道力扣(Leetcode)做一宿”的窘境?你是否也有过这样的经历,题型不算很难,看题解也能弄明白,可一到自己做就变成了与题面面相觑无从下手?

一、🌱6. N 字形变换

  • 题目描述:将一个给定字符串 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);

  • 来源:力扣(LeetCode)

  • 难度:中等

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

  • 示例 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”

🌴解题

1.构造N字形状数组

题目要求的是将字符每一个字母按一个反的N字形进行填充,然后换行输出字符,我们就可以直接构造一个这样的反N字形数组,反N字形数组里面的数字是字符串中字符的序号,其他位置则填0。注意在模拟的过程中返回将序号-1。
在这里插入图片描述
我们观察也可以发现我们需要构造多大的N字形数组是有规律的(一个类似的V可以容纳多少个字符),所以我们可以先计算至少需要多大的数组空间,减少内存占用。
在这里插入图片描述

class Solution {
    public String convert(String s, int numRows) {
        if(numRows==1)return s;
        int k=s.length()/(2*(numRows-1)+1)+1;//判断要多少个N
        int [][]Nmodel=new int[numRows][numRows*k];
        int sindex=1;
        int i=-1,j=0;
        for (; j < numRows*k; j++) {
            for (i++; i < numRows; i++) {
                Nmodel[i][j]=sindex;sindex++;
                if(sindex>s.length())break;
            }
            if(sindex>s.length())break;
            i--;
            for (i--; i >=0; i--) {
                j++;
                Nmodel[i][j]=sindex;sindex++;
                if(sindex>s.length())break;
            }
            if(sindex>s.length())break;
            j--;i++;
        }
        StringBuilder strb=new StringBuilder();
        for (int l = 0; l < numRows; l++) {
            for (int m = 0; m < numRows*k; m++) {
                if(Nmodel[l][m]!=0)
                    strb.append(s.charAt(Nmodel[l][m]-1));
            }
        }
        return new String(strb);

    }
}

在这里插入图片描述

2.构造序号数组

前面构造出一个模拟的数组还是操作有些复杂,我们可以发现N字形数组每一行都是有规律的变换的。
numRows=3,我们发现每一行左右相邻数字相隔3、1、3个数。
在这里插入图片描述
numRows=4,我们发现每一行左右相邻数字单数相隔5、3、1、5,双数相隔5、1、3、5个数。在这里插入图片描述
numRows=5,我们发现每一行左右相邻数字单数相隔7、5、3、1、7,双数相隔7、1、3、5、7个数。
在这里插入图片描述
于是我们先创建行变化的numRows*2 大小的数组,再直接构建这样的序号规律数组,其中利用一个递增的 tag %2 标志单双数。这样只需要按顺序写数组,按顺序读数组,前面一种方法中间的空白处填0的问题也没了。

class Solution {
    public String convert(String s, int numRows) {
       if(numRows==1)return s;
     
        int [][]Nmodel=new int[numRows][s.length()/2+1];
        int[][]change=new int[numRows][2];
        change[0][0]=numRows*2-3;
        change[numRows-1][0]=numRows*2-3;

        for (int i = 1; i < numRows-1; i++) {
            change[i][0]=change[i-1][0] - 2;
        }
        for (int i = 0; i < numRows; i++) {
            change[i][1]=change[numRows-1-i][0];
        }
        Nmodel[0][0]=0;
        for (int i = 1; i < numRows; i++) {
            Nmodel[i][0]=Nmodel[i-1][0]+1;
        }
        int tag=1;
        for (int i = 0; i < numRows; i++,tag=1) {
            for (int j = 1; j < s.length()/2+1; j++) {
                tag++;
                Nmodel[i][j]=Nmodel[i][j-1]+change[i][tag%2]+1;
            }
        }

        StringBuilder strb=new StringBuilder();
        for (int l = 0; l < numRows; l++) {
            for (int m = 0; m < s.length()/2+1; m++) {
                if(Nmodel[l][m]>=s.length())break;
                strb.append(s.charAt(Nmodel[l][m]));
            }
        }
        return new String(strb);
    }
}

在这里插入图片描述

3.直接用数组

前面一种方法写了数组又马上读数组,那我们也可以不构建序号数组,直接通过计算序号变化就进行字符串的添加,可以在上一个方法上面继续改。当然前面的行变化numRows*2 大小的数组是需要提前写一下,然后判断字符序号是否超出字符串长度,就进行下一行。

class Solution {
    public String convert(String s, int numRows) {
       if(numRows==1)return s;

        int[][]change=new int[numRows][2];
        change[0][0]=numRows*2-3;
        change[numRows-1][0]=numRows*2-3;

        for (int i = 1; i < numRows-1; i++) {
            change[i][0]=change[i-1][0] - 2;
        }
        for (int i = 0; i < numRows; i++) {
            change[i][1]=change[numRows-1-i][0];
        }

        StringBuilder strb=new StringBuilder();

        int tag=1;
        int bfindex,tindex;
        for (int i = 0; i < numRows; i++,tag=1) {
            bfindex=i;
            if(bfindex>=s.length())break;
            strb.append(s.charAt(bfindex));
            for (int j = 1; j < s.length()/2+1; j++) {
                tag++;
                tindex=bfindex+change[i][tag%2]+1;
                if(tindex>=s.length())break;
                strb.append(s.charAt(tindex));
                bfindex=tindex;
            }
        }

        return new String(strb);
    }
}

在这里插入图片描述


🌵雄州雾列,俊采星驰。台隍枕夷夏之交,宾主尽东南之美。🌷

返回第一页。☝


☕物有本末,事有终始,知所先后。🍭

🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓

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

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

相关文章

5.3 Bootstrap 模态框(Modal)插件

文章目录 Bootstrap 模态框&#xff08;Modal&#xff09;插件用法选项方法事件 Bootstrap 模态框&#xff08;Modal&#xff09;插件 模态框&#xff08;Modal&#xff09;是覆盖在父窗体上的子窗体。通常&#xff0c;目的是显示来自一个单独的源的内容&#xff0c;可以在不离…

C语言:杨氏矩阵中查找某数(时间复杂度小于O(N))

题目&#xff1a; 有一个数字矩阵&#xff08;二维数组&#xff09;&#xff0c; 矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c; 请编写程序在这样的矩阵中查找某个数字是否存在&#xff0c; 要求&#xff1a;时间复杂度小于O(N)。 思路&#xff1…

Linux中docker的基本操作

文章目录 一、docker概述1.1 什么是docker1.2 Docker与虚拟机的特性区别1.3 容器在内核中支持2种重要技术1.4 docker的核心概念 二、安装docker三、Docker 镜像操作四、Docker 容器操作 一、docker概述 1.1 什么是docker 是一个开源的应用容器引擎&#xff0c;基于go语言开发…

Spring Web MVC 详解(1)

目录 一、介绍 MVC 二、Spring MVC 的三个基本功能 1.1 连接功能 1.2 Spring MVC 的创建和使用 1.3 RequestMappig 介绍 1.4 Spring MVC 实现用户和 Spring 程序的连接 1.5 GetMapping 和 PostMaping 注解 1.6 Get 和 Post请求注解的多种写法 2.1 获取请求中参数的功…

Redis的内存回收与内存淘汰策略

对于redis这样的内存型数据库而言&#xff0c;如何删除已过期的数据以及如何在内存满时回收内存是一项很重要的工作。 常见的redis内存回收的工作主要分为两个方面&#xff1a; 清理过期的key在内存不足时回收到足够的内存用以存储新的key 清理过期的key 我们很少在redis中…

直接插入排序、希尔排序、直接选择排序、堆排序、冒泡排序——“数据结构与算法”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容是数据结构与算法啦&#xff0c;是排序&#xff01;&#xff01;&#xff01;下面&#xff0c;让我们进入七大排序的世界吧&#xff01;&#xff01;&#xff01; 排序的概念及其运用 排序的概念 排序&#xff1a;所谓排序…

算法提高-动态规划-斜率优化DP

斜率优化DP AcWing 300. 任务安排1AcWing 301. 任务安排2AcWing 302. 任务安排3AcWing 303. 运输小猫 AcWing 300. 任务安排1 #include <iostream> #include <cstring>typedef long long LL;using namespace std;const int N 5e3 10;int st[N], sc[N]; LL f[N];…

全志F1C200S嵌入式驱动开发(基于usb otg的spi-nor镜像烧入)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 前面既然已经搞定了spi-nor驱动,那么下一步考虑的就是怎么从spi-nor flash上面加载uboot、kernel和rootfs。目前spi-nor就是一块白片,上面肯定什么都没有,那么这个时候,我们要做…

贤鱼的刷题日常-P3375 【模板】KMP 字符串匹配

&#x1f3c6;今日学习目标&#xff1a; &#x1f340;例题讲解P3375 【模板】KMP 字符串匹配 ✅创作者&#xff1a;贤鱼 ⏰预计时间&#xff1a;25分钟 &#x1f389;个人主页&#xff1a;贤鱼的个人主页 &#x1f525;专栏系列&#xff1a;c &#x1f341;贤鱼的个人社区&…

(css)清除el-table背景色

(css)清除el-table背景色 效果&#xff1a; <el-table:data"gridData":header-cell-style"{text-align:center,color: #fff}":cell-style"{text-align:center,color: #fff }" ><el-table-column type"index" label"序号…

linux下 UART串口相关

RS232的串口设备在linux 上会被识别为 /dev/ttyS* 或者 ttymxc* 一、串口简介 操作串口我们一般通过以下指令&#xff1a; 1、查看串口波特率等信息&#xff1a; stty -F /dev/ttyS0 -a #ttyS0为要查看的串口 2、设置串口参数&#xff1a; stty -F /dev/ttyS0 ispeed 115…

Qt实现双控制柄的Slider

目标 实现带有左右两个控制柄的滑动条&#xff1b;控件可设定最小值和最大值&#xff1b;控件可设定控制柄的最小距离&#xff1b; 效果演示 思路 1. 标准的Slider控件只有一个Handle&#xff0c;所以想要通过改造QSlider来实现两个Handle是非常困难的&#xff0c;“自绘”…

SpringBoot+jasypt-spring-boot-starter实现配置文件明文加密

1.使用环境 springboot:2.1.4.RELEASE JDK:8 jasypt-spring-boot-starter:3.0.2 2.引入依赖 !-- 配置文件加密 --> <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><ver…

rust学习-智能指针

适用场景 有一个在编译时未知大小的类型&#xff0c;想在需要确切大小的上下文使用该类型值 示例1 无意义的例子&#xff1a;将一个单独的值存放在堆上并不是很有意义&#xff0c;b更应该放到栈上 fn main() {let b Box::new(5);// box 在 main 的末尾离开作用域时&#x…

R语言 PCA筛选变量

#PCA-筛选变量 X <- data[,2:415] pca <- prcomp(X, center TRUE, scale. TRUE) # 进行主成分分析 summary(pca) # 查看各个主成分的解释方差比例 library(factoextra) #碎石图依赖-fviz fviz_eig(pca,addlabelsT) #碎石图 X_selected <- pca$x[,1:20] # 选择前n个主…

pytorch实现图像投影变换

import cv2 import torchdef cpu_remap(numpy_img,mapx,mapy):return cv2.remap(numpy_img,mapx,mapy,cv2.INTER_LINEAR)def gpu_remap(numpy_img,map_tensor):numpy_img:原始图像格式为ndarraymap_tensor:[N,H,W,C]用于grid_sample的map参数&#xff0c;需要规制到-1到1# 准备…

opencv直方图

#include "iostream" #include "opencv2/opencv.hpp" using namespace std; using namespace cv;int main() {Mat img, gray;img imread("r4.jpg");cvtColor(img, gray, COLOR_BGR2GRAY);int nimages 1;//图片数量const int channels[] { 0 …

信捷PLC RC低通滤波器(C语言实现)

PLC信号处理系列之RC低通滤波器算法详细介绍请参考下面文章: PLC信号处理系列之一阶低通(RC)滤波器算法_plc滤波算法程序_RXXW_Dor的博客-CSDN博客1、先看看RC滤波的优缺点 优点:采用数字滤波算法来实现动态的RC滤波,则能很好的克服模拟滤波器的缺点; 1、在模拟常数要求较…

位域与共用体在通讯领域的应用

最近看到些代码&#xff0c;定义变量还能指定位宽&#xff0c;很有意思。像这样 unsigned int bit1 : 1;冒号 (&#x1f603; 后面的数字1表示变量的位宽或大小。 像这样的大小声明在低级编程和位操作中常被使用&#xff0c;以便精确控制变量的大小。 通讯协议解析用的多。 下面…

电脑安装双系统ubuntu18.04+windows后开机直接进入Windows解决方法

电脑型号&#xff1a;联想拯救者Y9000K2021H 系统&#xff1a;Windows11Ubuntu18.04双系统 问题&#xff1a;笔记本安装双系统后&#xff0c;Windows系统下处理word或者看论文&#xff1b;Ubuntu18.04系统安装ros进行机械臂控制等的研究。但最近开机后发现没有系统选项了&#…