面试经典150题——Z 字形变换

面试经典150题 day22

      • 题目来源
      • 我的题解
        • 方法一 使用StringBuilder数组模拟矩阵
        • 方法二 找规律+直接构造

题目来源

力扣每日一题;题序:6

我的题解

方法一 使用StringBuilder数组模拟矩阵

如果numRows是1,则直接返回s。
否则,创建numRows长度的StringBuilder数组,模拟生成Z字形变换后的矩阵。最后将StringBuilder数组使用String.join联合起来

时间复杂度:O(n)
空间复杂度:O(n)

public String convert(String s, int numRows) {
    if(numRows==1)
        return s;
    int n=s.length();
    StringBuilder[] sbs=new StringBuilder[numRows];
    for(int i=0;i<numRows;i++)
        sbs[i]=new StringBuilder();
    int i=0;
    int start=0;
    while(n>0){
        //往下走
        while(n>0){
            sbs[i++].append(s.charAt(start++));
            n--;
            if(i==numRows){
                i=numRows-2;
                break;
            }
        }
        //往上走
        while(n>0){
            sbs[i--].append(s.charAt(start++));
            n--;
            if(i==-1){
                i=1;
                break;
            }
        }
    }
    return String.join("", sbs); 
}
//也可以使用List存储
public String convert(String s, int numRows) {
    if(numRows==1)
        return s;
   int n=s.length();
    List[] list=new ArrayList[numRows];
    for(int i=0;i<numRows;i++){
        list[i]=new ArrayList<>();
    }
    boolean flag=false;
    int index=0;
    for(int i=0;i<n;i++){
        list[index].add(s.charAt(i));
        if(!flag){

            if(index+1==numRows){
                index=index-1;
                flag=true;
            }else{
                index++;
            }
        }else{
            if(index-1<0){
                index=1;
                flag=false;
            }else{
                index--;
            }
        }
    }
    StringBuilder sb=new StringBuilder();
    for(int i=0;i<numRows;i++){
        list[i].forEach(sb::append);
    }
    return sb.toString();

}
方法二 找规律+直接构造

研究矩阵的每个非空字符会对应到 s 的哪个下标(记作 idx),从而直接构造出答案。
由于 Z 字形变换的周期为 t=2r−2,因此对于矩阵第一行的非空字符,其对应的 idx均为 t 的倍数,即 idx≡ 0(mod t);同理,对于矩阵最后一行的非空字符,应满足 idx≡ r−1(mod t)。
对于矩阵的其余行(行号设为 i),每个周期内有两个字符,第一个字符满足 idx ≡ i (mod t),第二个字符满足 idx ≡ t−i(mod t)。
下图是numRows为4时的规律
在这里插入图片描述

时间复杂度:O(n)
空间复杂度:O(1)

public String convert(String s, int numRows) {
    int n = s.length();
    int r = numRows;
    if (r == 1 || r >= n) {
        return s;
    }
    int t = r * 2 - 2;
    StringBuilder ans = new StringBuilder();
    for (int i = 0; i < r; i++) { // 枚举矩阵的行
        for (int j = 0; j < n - i; j += t) { // 枚举每个周期的起始下标
            ans.append(s.charAt(j + i)); // 当前周期的第一个字符
            if (i > 0 && i < r - 1 && j + t - i < n) {
                ans.append(s.charAt(j + t - i)); // 当前周期的第二个字符
            }
        }
    }
    return ans.toString();
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】算法的效率(时间复杂度和空间复杂度)

目录 一.算法的效率 二.时间复杂度 1.概念 2.大O的渐进表示法 3.常见时间复杂度计算举例 三.空间复杂度 四.常见复杂度对比 五. 复杂度的oj练习 1.消失的数字 2.轮转数字&#xff1a; 一.算法的效率 算法在编写成可执行程序后&#xff0c;运行时需要耗费时间资源和空…

区块链 | IPFS:Merkle DAG(进阶版)

&#x1f98a;原文&#xff1a;Merkle DAGs: Structuring Data for the Distributed Web &#x1f98a;写在前面&#xff1a;本文属于搬运博客&#xff0c;自己留存学习。 1 Merkle DAG 当我们在计算机上表示图时&#xff0c;必须通过提供节点和边的具体表示来编码我们的数据…

黑马点评项目个人笔记+项目优化调整

博客须知 本篇博客内容来源与黑马点评项目实战篇-16.用户签到-实现签到功能_哔哩哔哩_bilibili&#xff0c;作者对视频内容进行了整合&#xff0c;由于记笔记时图片使用的是本地路径&#xff0c;所以导致博客的图片无法正常显示&#xff0c;如果有图片需求可以下载上方的pdf须…

给thinkpadP15V加装固态硬盘的TIPS

O(∩_∩)O首先要先恭喜小编&#xff0c;终于舍得给咱们的小伙伴加固态硬盘了 1、确定固态硬盘的类型&#xff1a; M.2接口NVMe协议&#xff0c; Pcie通道( Peripheral company interconnect express)&#xff08;3.0第三代1gb每秒&#xff0c;4.0第四代2 gb每秒&#xff09;x4…

PDF中伪代码、原理示意图等导出为矢量图

需求&#xff1a;将 LaTeX 中生成的伪代码 PDF 转换成 svg 或 emf 格式的矢量图&#xff0c;然后插入 word 或 ppt 中。 1 伪代码PDF导出为矢量图 1.1 通过 Adobe Illustrator 处理将 先新建一个空白的PDF&#xff0c;然后文件-->置入导入PDF&#xff1b; 2.选中这个图片…

k8s部署maven项目

failed to verify certificate: x509: certificate signed by unknown authority 今天在执行kubectl get nodes的时候报的证书验证问题&#xff0c;看了一圈首次搭建k8s的都是高频出现的问题。 couldn’t get current server API group list: Get “https://kubernetes.docker…

SwiftUI 5.0(iOS 17.0,macOS 14.0+)新 Inspector 辅助视图之趣味漫谈

概览 在 SwiftUI 开发中,苹果为我们提供了多种辅助视图用来显示额外信息从而极大丰富了应用的表现力,比如:Alert、Sheet、ContextMenu 等等。 从 SwiftUI 5.0(iOS 17+)开始, 又增加了一种全新的辅助视图:Inspector。 在本篇博文中,您将学到如下内容: 概览1. Inspe…

[笔试训练](十一)

目录 031&#xff1a;游游的水果大礼包 032&#xff1a;买卖股票的最好时机&#xff08;二&#xff09; 033&#xff1a;倒置字符串 031&#xff1a;游游的水果大礼包 游游的水果大礼包 (nowcoder.com) 题目&#xff1a; 题解&#xff1a; 枚举&#xff1a;依次枚举1号礼…

连接一个 IP 不存在的主机时,会发生什么?(面试)

一、IP 不存在时 如果 IP 在局域网内&#xff0c;会发送 N 次 ARP 请求获得目的主机的 MAC 地址&#xff0c;同时不能发出 TCP 握手消息。 如果 IP 在局域网外&#xff0c;会将消息通过路由器发出&#xff0c;但因为最终找不到目的地&#xff0c;触发 TCP 重试流程。 二、IP…

React 第十五章 Ref

React ref 是 React 中一个用于访问组件中 DOM 元素或者类实例的方式。它允许我们直接操作 DOM&#xff0c;而不需要通过 state 或 props 来更新组件。 过时 API&#xff1a;String 类型的 Refs 在最最早期的时候&#xff0c;React 中 Ref 的用法非常简单&#xff0c;类似于 …

设计模式: 工厂模式

工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一&#xff0c;这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。 工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。 工厂模式属于创建型…

如何用 Redis 实现延迟队列?

延迟队列是一种常见的消息队列模式&#xff0c;用于处理需要延迟执行的任务或消息。Redis 是一种快速、开源的键值对存储数据库&#xff0c;具有高性能、持久性和丰富的数据结构&#xff0c;因此很适合用于实现延迟队列。在这篇文章中&#xff0c;我们将详细讨论如何使用 Redis…

数据库(MySQL)基础:多表查询(一)

一、多表关系 概述 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种&#xff1a;…

【STM32+HAL】SDIO+DMA模式读写SD卡

一、准备工作 有关CUBEMX的初始化配置&#xff0c;参见我的另一篇blog&#xff1a;【STM32HAL】CUBEMX初始化配置 二、所用工具 1、芯片&#xff1a; STM32F407ZGT6 2、IDE&#xff1a; MDK-Keil软件 3、库文件&#xff1a;STM32F4xxHAL库 三、实现功能 实现用SDIODMA读写S…

【Linux系统编程】第十二弹---编辑器gcc/g++使用

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、什么是gcc/g 2、gcc/g编辑器的安装 3、gcc/g编译的四个步骤 2.1、预处理 2.2、编译 2.3、汇编 2.4、链接 4、函数库 …

平衡有序二叉树的构建(AVL树,一步一步讲解,看完不会来砍我)

序 纸上得来终觉浅&#xff0c;觉知此事要躬行 读者只有自己一步一步的跟着做&#xff0c;才能真正学会&#xff0c;看是看不会的 平衡有序二叉树的构建 平衡二叉树 整棵树任意一个节点的左右子树高度差值的绝对值<1&#xff08;高度相等或相差1&#xff09; demo1 根…

java中的字节流和File类

目录 正文&#xff1a; 1.File类 1.1概述 1.2常用方法 2.FileInputStream 2.1概述 2.2常用方法 3.FileOutputStream 3.1概述 3.2常用方法 总结&#xff1a; 正文&#xff1a; 1.File类 1.1概述 File类是Java中用来表示文件或目录的类&#xff0c;它提供了一系列方…

【C++语言】字符串String类的深拷贝与浅拷贝

深浅拷贝定义 拷贝对象时&#xff0c;需要创建相同的字节序、类型、和资源。 经典的string类问题 // 为了和标准库区分&#xff0c;此处使用String class String { public:/*String():_str(new char[1]){*_str \0;}*///String(const char* str "\0") 错误示范//…

Dynamic World Training Data动态世界训练和验证数据集(土地分类和土地利用)

摘要: 动态世界训练数据(Dynamic World Training Data )是一个由超过 50 亿像素的人工标注欧空局哨兵-2 卫星图像组成的数据集,分布在从世界各地收集的 24000 块瓷砖上。该数据集旨在训练和验证自动土地利用和土地覆被制图算法。分辨率为 10 米的 5.1km x 5.1km 瓦片采用十…

软件系统安全设计(安全保证措施)

软件安全保证措施word 软件所有全套资料获取进主页或者本文末个人名片直接。