【刷题记录】6. Z 字形变换

简介: 【刷题记录】6. Z 字形变换

一、题目描述


来源:力扣(LeetCode)


将一个给定字符串 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);


示例 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 <= s.length <= 1000
  • s 由英文字母(小写和大写)、',' 和 '.' 组成
  • 1 <= numRows <= 1000


二、思路分析


  • 0.0 Z形变换应该叫 И 形变换
  • 从题目来看 原字符串是 Z 形的排列顺序
  • 输出结果 其实就是 从第一行(S1)到第n行(Sn)的n个子串拼接.
  • 我们只要按定义N个子串 按顺序遍历Z形字符串 把每个字符放入到对应行的子串记录中即可
  • 行是从1-numRows 然后 numRows-1,即是该字符属于第几行子串的规律


如上面的例子2


解释:

P     I    N  ---s1 = pin

A   L S  I G  ---s2 = alsin

Y A   H R     ---s3 = yanr

P     I       ---s4 = pi


三、代码实现


class Solution {
    public String convert(String s, int numRows) {
if(numRows < 2) return s;
        List<StringBuilder> rows = new ArrayList<StringBuilder>(); //子串集合
        StringBuilder res = new StringBuilder();
for(int i =0; i < numRows; i++) rows.add(new StringBuilder());
        int i =0;   //正向的时候的该字符所在行数
        int m =-1;  //用于行数变化 正向+1 反向-1
for(char c : s.toCharArray()) {
            rows.get(i).append(c);
if(i ==0 || i == numRows -1){
                m =- m;
            }
            i += m;
        }
for(StringBuilder row : rows) res.append(row);
        return res.toString();
    }
}

复杂度分析:


  • 时间复杂度:
    网络异常,图片无法展示
    |
    遍历一遍字符串 s
  • 空间复杂度:
    网络异常,图片无法展示
    |
    N为字符串长度


运行结果


网络异常,图片无法展示
|


总结


这种模拟题最主要的还是要多找出来规律,找出相应的规律,然后转化为数学问题,就比较容易解决了。

目录
相关文章
|
Linux 网络虚拟化 虚拟化
Linux虚拟网络设备深度解析:使用场景、分类与开发者指南
Linux虚拟网络设备支撑着各种复杂的网络需求和配置,从基础的网络桥接到高级的网络隔离和加密🔐。以下是对主要Linux虚拟网络设备的介绍、它们的作用以及适用场景的概览,同时提出了一种合理的分类,并指出应用开发人员应该着重掌握的设备。
Linux虚拟网络设备深度解析:使用场景、分类与开发者指南
|
SQL 关系型数据库 MySQL
mysql使用default给列设置默认值的问题
mysql使用default给列设置默认值的问题
275 0
Ansible-playbook 并发运行async、poll(学习笔记二十二)
ansible默认只会创建5个进程,所以一次任务只能同时控制5台机器执行.那如果你有大量的机器需要控制,或者你希望减少进程数,那你可以采取异步执行.ansible的模块可以把task放进后台,然后轮询它.
4862 0
|
4月前
|
SQL 数据库 开发者
Python中使用Flask-SQLAlchemy对数据库的增删改查简明示例
这样我们就对Flask-SQLAlchemy进行了一次简明扼要的旅程,阐述了如何定义模型,如何创建表,以及如何进行基本的数据库操作。希望你在阅读后能对Flask-SQLAlchemy有更深入的理解,这将为你在Python世界中从事数据库相关工作提供极大的便利。
466 77
|
10月前
|
消息中间件
为什么选择轻量消息队列(原 MNS)作为云产品间的消息通道?
一张图带您快速了解为什么众多云产品间的消息通道选择轻量消息队列(原 MNS)🤔
152 76
|
设计模式 Java 开发者
Head First设计模式详解与应用场景分析
Head First设计模式详解与应用场景分析
|
JSON 数据管理 测试技术
自动化测试工具Selenium Grid的深度应用分析深入理解操作系统的内存管理
【5月更文挑战第28天】随着互联网技术的飞速发展,软件测试工作日益复杂化,传统的手工测试已无法满足快速迭代的需求。自动化测试工具Selenium Grid因其分布式执行特性而受到广泛关注。本文旨在深入剖析Selenium Grid的工作原理、配置方法及其在复杂测试场景中的应用优势,为测试工程师提供高效测试解决方案的参考。
|
存储 供应链 安全
基于区块链技术的智能合约安全性分析
【5月更文挑战第31天】本文深入探讨了区块链技术中智能合约的安全性问题,通过分析现有智能合约的安全漏洞和攻击手段,提出了一系列增强智能合约安全性的策略。文章首先介绍了区块链和智能合约的基本概念,随后详细讨论了智能合约面临的安全挑战,包括代码漏洞、重入攻击等问题,并对比分析了不同平台下智能合约的安全性差异。最后,文章提出了一系列提高智能合约安全性的建议,旨在为区块链应用的健康发展提供参考。
|
数据采集 JavaScript 前端开发
分享66个NodeJs项目源码总有一个是你想要的
分享66个NodeJs项目源码总有一个是你想要的
638 0
|
机器学习/深度学习 算法 API
【Paddle】PCA线性代数基础 + 领域应用:人脸识别算法(1.1w字超详细:附公式、代码)
【Paddle】PCA线性代数基础 + 领域应用:人脸识别算法(1.1w字超详细:附公式、代码)
293 0

热门文章

最新文章