力扣面试经典算法150题:Z 字形变换

news2024/11/15 7:19:47

Z 字形变换

今天的题目是力扣面试经典150题中的数组的中等难度题: Z 字形变换。

题目链接:https://leetcode.cn/problems/zigzag-conversion/description/?envType=study-plan-v2&envId=top-interview-150

题目描述

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

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

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

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。

  • 示例 1:

    • 输入:
      s = “PAYPALISHIRING”, numRows = 3

    • 输出:
      “PAHNAPLSIIGYIR”

    • 解释:

      P	  A	    H	  N 
      A  P  L  S  I  I  G 
      Y	  I	    R
      
  • 示例 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”

    • 解释:
      没法转换,直接返回字符串

题目分析

题目会给定一个字符串和一个数字num,要求把字符串分成num行。在分行的时候,要求按列Z字形排列。

其实这个Z字形可能不是很直观,再拆分成一个类似字的左边的竖提就清晰一点。

用示例来讲解一下:

  1. 示例一:
    P-A-Y-P组成第一个竖提,A-L-I-S组成第二个竖提,H-I-R-I组成第三个竖提,最后的N-G组成一个不完整的竖提。
  2. 示例二:
    P-A-Y-P-A-L组成第一个竖提,I-S-H-I-R-I组成第二个竖提,N-G组成最后一个不完成的竖提。

仔细观察,是不是知道了怎么按行数排列字符串了。

排列好字符串以后,我们从左到右,从第一排到最后一排,把数组全部拼接起来即可。

解题思路

目前来看,以作者的水平这个题目没有能够方便使用的算法,只能暴力破解。

  1. 首先确认拼接方式,我们按行数循环,凭借每行的字符,因为题目要求我们从左往右拼接给出结果。
  2. 确认每行中每列字符在字符串中的索引。根据前面的分析,三行的时候四个字符组成一个竖提,也就是说,每次循环需要四个字符,四行的时候六个字符组成一个竖提,我们自己再尝试两行,五行等情况.
    最后你会发现每次循环的字符数 = 2*(num - 1)。 2 = 2*(2-1),4 = 2*(3-1),6 = 2*(4-1),8 = 2*(5-1)。。。。。
  3. 那么我们可以创建num个数组,每个数组 存放一行的内容。
  4. 循环字符串,使用当前下标对当前行数对应的字符数取模,取模的值与行数比较,如果小于行数的,直接使用当前取模值为当前行数。否则使用字符数减去取模值。注意因为我们循环是从0开始,所以这里的实际行数应该加1。比如取模值为0,实际是第一行。
  5. 拼接所有行的字符。

根据以上分析,我们可以编写实现代码。

实际算法代码

以下是暴力解答的代码实现:

public class ZigzagConversion {
	
	 public static void main(String[] args) {
        ZigzagConversion solution = new ZigzagConversion();
        System.out.println(solution.convert("PAYPALISHIRING", 3)); // 输出 "PAHNAPLSIIGYIR"
        System.out.println(solution.convert("PAYPALISHIRING", 4)); // 输出 "PINALSIGYAHRPI"
     }
	
     public String convert(String s, int numRows) {
        // 行数是1的矩阵或者行数就等于字符串长度的,直接返回字符串本身
        if (numRows == 1 || numRows >= s.length()) return s;

        // 定义一个数组,用来存储每一行的字符串
        StringBuilder[] rows = new StringBuilder[numRows];
        // 定义每行的拼接对象,注意行数 = i-1
        for (int i = 0; i < numRows; i++) {
            rows[i] = new StringBuilder();
        }

        // 获取字符串长度用于循环
        int n = s.length();
        // 获取每次循环时构成Z性的字符长度
        int cycleLen = 2 * numRows - 2;

        // 循环字符串
        for (int i = 0; i < n; i++) {
            // 取模
            int rowIndex = i % cycleLen;
            // 小于行数的索引,行数就等于索引,大于的用字符数减取模值,因为此时从下往上排列
            if (rowIndex < numRows) {
                rows[rowIndex].append(s.charAt(i));
            } else {
                rows[cycleLen - rowIndex].append(s.charAt(i));
            }
        }

        // 拼接结果
        StringBuilder result = new StringBuilder();
        for (StringBuilder row : rows) {
            result.append(row);
        }

        return result.toString();
    }
}

结果

运行程序,正常输出答案:

在这里插入图片描述

提交到力扣,也通过测试:

在这里插入图片描述

总结

又是暴力解答的一题,没有已经归纳好的算法,单纯就是总结规律加上字符串数组循环拼接的基础知识。

善于分析归纳,扎实的基础,基本上没有解不出的题目,暴力解答也是解答,别拿豆包不当干粮,是吧?

准备直面困难题目了,加油!!!

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

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

相关文章

Jmeter 的 jar 包开发环境搭建

01 JDK环境变量配置 JAVA_HOMEE:\Program Files\Java\jdk1.8.0_102 Path%JAVA_HOME%\bin; CLASSPATH.;%JAVA_HOME%\lib\dt.jar;.;%JAVA_HOME%\lib\tools.jar 验证环境变量有没有生效&#xff1a;看到如下信息说明 JDK 环境变量已经生效 02 配置 maven 环境 1、下载地址&…

js中数组的定义及使用

数组的定义 Array 存储按位存储&#xff0c;紧密结构,在数组中查找元素&#xff0c;就必须要遍历数组&#xff0c;查找速度慢。 优点可以根据当前元素找到前一个或者后一个元素&#xff0c;可以排序 数组引用对象的是强引用&#xff0c;存储的是她的引用地址 length属性可读可…

TF | SD 卡出现无法删除的文件,乱码文件该如何处理 macOS

TF | SD 卡出现无法删除的文件&#xff0c;乱码文件该如何处理 macOS 一、问题描述 最近手头有张用在 Miyoo 掌机上的游戏 TF 卡&#xff0c;在macOS 系统下在回收站中出现了几个特殊文件名的文件&#xff0c;始终无法删除。 二、试着解决 我试过了网上的所有方法都无法删除…

rv1126-rv1109-mkcramfs-mkfs.cramfs-打包文件系统

事情是这样的: 定制了文件系统打包功能;然后我是根据这个指令 fakeroot mkfs.cramfs rootfs_glibc_rv1126/ rootfs.img mkfs.cramfs rootfs_glibc_rv1126/ rootfs.img 起因就是这个fakeroot; 不加的话打出来的rootfs.img是没有用户权限的 然后我根据fakeroot mkfs.cramfs ro…

米壳AI:跨境电商日本市场必备神器!

各位跨境电商小伙伴们&#xff0c;在开拓日本市场的过程中&#xff0c;产品图片的翻译问题是不是常常让你感到困扰呢&#xff1f; 别着急&#xff0c;今天就给大家推荐一个超棒的在线翻译工具--米壳AI&#xff0c;它必将成为你跨境之路上的得力助手&#xff0c;让你如虎添翼。…

网络-多路io

了 fcntl 函数来操作文件描述符的状态标志&#xff0c;其中主要是为了设置非阻塞模式。下面是对 fcntl 函数及其参数的详细解释&#xff1a; fcntl 函数 fcntl 是一个用于操作文件描述符的系统调用&#xff0c;可以用来设置或获取文件描述符的各种属性。其原型如下&#xff1…

Django学习实战篇二(适合略有基础的新手小白学习)(从0开发项目)

前言&#xff1a; 从这一章开始&#xff0c;我们来创建项目typeidea&#xff0c;我把它放到了GitHub上。强烈建议你也到GitHub上注册一个账号&#xff08;如果没有的话&#xff09;&#xff0c;然后创建这样的项目。当然&#xff0c;你也可以起一个属于自己的名称。这个项目就是…

tensorrt plugin

自定义plugin 流程 首先明确要开发的算子&#xff0c;最好是 CUDA 实现&#xff1b;继承 IPluginV2DynamicExt / IPluginV2IOExt类实现一个Plugin 类&#xff0c;在这里调用前面实现的算子&#xff1b;继承 IPluginCreator 类实现一个 PluginCreator 类&#xff0c;用于创建插…

【数据结构取经之路】布隆过滤器BloomFilter原理、误判率推导、代码实现

目录 背景介绍 简介 布隆过滤器的实现思路 布隆过滤器的作用 布隆过滤器误判率推导过程 布隆过滤器的实现 布隆过滤器的删除问题 布隆过滤器的优缺点 布隆过滤器的应用 背景介绍 在一些场景下面&#xff0c;有大量数据需要判断是否存在&#xff0c;而这些数据不是整…

物联网之MQTT

一&#xff0c;MQTT 及其在物联网中的应用 MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种轻量级的消息传输协议&#xff0c;设计用于低带宽、延迟高、不稳定的网络环境&#xff0c;特别适合物联网&#xff08;IoT&#xff09;应用。它采用了发布/订…

案例 | 稳石机器人赋能日化企业内部物流提质增效

近年来&#xff0c;日化产业高速发展&#xff0c;以“清洁类”及“化妆品类”为主的日化品在人们生活中扮演着不可或缺的角色。然而在发展过程中&#xff0c;诸多难点也开始显头&#xff0c;招工难用工贵、生产速度受到掣肘等难题&#xff0c;都对日化企业可持续发展构成挑战。…

智慧安防EasyCVR视频监控汇聚管理平台云端录像时间轴拖动不跳转,是什么原因?

视频汇聚EasyCVR视频智能管理系统以其强大的拓展性、灵活的部署方式、高性能的视频能力和智能化的分析能力&#xff0c;为各行各业的视频监控需求提供了优秀的解决方案。EasyCVR平台支持多种视频流的外部分发&#xff0c;如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、…

国产SaaS的挑战与未来:探索用户增长的新路径

在数字化转型的浪潮中&#xff0c;SaaS&#xff08;软件即服务&#xff09;行业扮演着至关重要的角色&#xff0c;为企业提供了灵活、高效的数字化解决方案。然而&#xff0c;国产SaaS行业在快速发展的同时&#xff0c;也面临着诸多挑战&#xff0c;包括客户定制化需求高、市场…

上门家政系统源码开发详解

引言 随着现代生活节奏的加快&#xff0c;越来越多的家庭选择聘请家政服务人员来解决日常生活中诸如清洁、烹饪等琐事。面对这一市场需求&#xff0c;开发一个高效的上门家政服务系统显得尤为重要。本文旨在探讨如何构建这样一个系统&#xff0c;并分享一些开发过程中需要注意的…

五、代理模式

代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式&#xff0c;它为其他对象提供一个代理以控制对这个对象的访问。代理对象通常会对真实对象的请求进行一些处理&#xff08;例如延迟初始化、访问控制、日志记录等&#xff09;&#xff0c;它能够在不改变目标…

K8s搭建过程,新手闭眼入!!!超详细教程

一、k8s搭建harbor仓库 前提&#xff1a;在另一台主机已搭建好harbor私人仓库&#xff0c;之前博客中有详细记录 环境&#xff1a;准备三台主机&#xff0c;一台master&#xff0c;一台node1&#xff0c;一台noed2 1.本地解析 将harbor镜像仓库所在的主机的域名写在所有主机…

Redis String 类型详解:操作命令、底层编码与使用案例

文章目录 一 . 常见命令1.1 set1.2 get1.3 mset、mget1.4 setnx、setex、psetex1.5 incr、incrby1.6 decr、decrby、incrbyfloat1.7 append1.8 getrange1.9 setrange1.10 strlen小结 二 . string 的编码方式三 . 应用场景3.1 缓存3.2 计数器3.3 共享会话3.4 手机验证码 Hello ,…

# 利刃出鞘_Tomcat 核心原理解析(十一)-- Tomcat 附加功能 WebSocket -- 2

利刃出鞘_Tomcat 核心原理解析&#xff08;十一&#xff09;-- Tomcat 附加功能 WebSocket – 2 一、Tomcat专题 - WebSocket - 案例 - 登录功能 1、在项目 dzs168_chat_room 中&#xff0c;导入 tomcat 项目依赖&#xff08; dzs168_chat_room/web/lib/ &#xff09; idea -…

花生壳的登录及获取二级域名

1、下载花生壳客户端 2、安装完毕 3、扫码登录 4、微信登录花生壳管理后台 5、二级域名的注册 已经帮我们自动生成了一个免费的二级域名。 我们可以用这个二级域名快速的建立网站了。

[YM]课设-C#-WebApi-Vue-员工管理系统 (七)员工统计表

前端&#xff1a; 注&#xff1a;这里主要解释下echarts组件&#xff0c;需要一定的Vue基础 emmmmm 明显能看到上面写“对不起暂未开发” 是的 这个是博主自己加上去的 but 这个统计表也是类似于Element UI的小组件 Element&#xff1a;Element - 网站快速成型工具 &am…