LeetCode6.Z字形变换

难度:中等

往期力扣与博主空间

题目链接 


目录

官方解法1-构造Z字型数组模拟

案例分析

规律探索

原因:

代码实现

代码分析:

问题

官方解法二-压缩上述二维数组

思路分析

代码实现

代码分析

问题

官方解法三-直接构造法

算法思想

代码实现

代码分析

结论


官方解法1-构造Z字型数组模拟

案例分析

案例一:

s = "PAYPALISHIRING", numRows = 3,当该案例构造成数组时,得到以下的图形

案例二:

s = "PAYPALISHIRING", numRows = 4当该案例构造成数组时,得到以下的图形

规律探索

  • 1.通过上面两个案例可得,我们可以将一列和一条斜线做作为一个周期t, t = r + r - -2 = 2r - 2
  • 2.通过观察,一个周期占用了r - 1
  • 3.假设,一共有n个元素,那么,n个元素一共有n / t 个周期,一共占用 c = n / t * (r - 1)列
  • 但是,由于可能最后几个元素不满一个周期,上面的等式明显是有问题的,只会取整,即会漏掉不满一个周期的那几个元素,要想解决这个问题,需将等式转换成 c  = (n + t - 1)/t * (r - 1)

原因:

  • 如果有这么一个场景,其一列能放六个元素,问13个元素需要放几列
  • 如果按照上面的思想去做这道题,t = 6,n = 13, c = n / t = 2,结果为2
  • 但是,显然,我们需要三行才可以承载所有的元素,所以,我们需要加上5即 18 / 6 = 3,就是三行
  • 同理上面

代码实现

class Solution {public String convert(String s, int numRows) {var r = numRows;var t = 2 * r - 2;var n = s.length();if (r >= n || r == 1) {return s;}var c = (n + t - 1)/t * (r - 1);var strBul = new StringBuilder();var matrix = new char[r][c];for (int i = 0,x = 0,y = 0; i < n; i++) {matrix[x][y] = s.charAt(i);if (i % t < r - 1) {x++;}else {x--;y++;}}for (int i = 0; i < r; i++) {for (int j = 0; j < c; j++) {if (matrix[i][j] != 0) {strBul.append(matrix[i][j]);}}}return strBul.toString();}
}

代码分析:

  • 1.第一个判断

    • 1.1r >= n时,就是所需要的行大于等于元素个数n,就是一整列的情况,不需要构造Z,直接返回
    • 1.2r == 1时,就是所需要的行等于1,就是一整行的情况,不需要构造Z,直接返回
  • 2.声明matrix二维数组用于构造Z字形与strBul拼接字符串
  • 3.for循环
    • 3.1变量的定义与初始化

      • 3.1.1 'i'用于遍历字符串,表示第i + 1个元素的下标,并初始化为0
      • 3.1.2 'x,y'分别表示二维数组matrix中的行与列,并初始化为0(我们从最左上角开始构造Z)
    • 3.2追加
    • 3.3if else详解
  • 4.最后将横向遍历二维数组,不是0的都拼接上去即可

问题

  • 这种解法会产生大量的冗余空间,这些冗余空间使得代码效率变低

官方解法二-压缩上述二维数组

思路分析

  • 我们不直接构造上述的二维数组,转而我们构造多个StringBuilder去完成上述的代码

代码实现

class Solution {public String convert(String s, int numRows) {var res = new StringBuilder();var r = numRows;var t = 2 * r - 2;var tBul = new StringBuilder[r];var n = s.length();for (int i = 0; i < r; i++) {tBul[i] = new StringBuilder();}        if (r >= n || r == 1) {return s;}for (int i = 0,x = 0; i < n; i++) {tBul[x].append(s.charAt(i));if (i % t < r - 1) {x++;}else {x--;}}for (var item : tBul) {res.append(item);}return res.toString();}
}

代码分析

  • 1.注意,在构造StringBuilder数组的时候不要用Arrays工具类里面的fill方法,因为这样会导致所有的下标都指向同一个StringBuilder对象
  • 2.for循环
    • 2.1因为每一个都是StringBuilder,所以y的创建就没有必要了
    • 2.2根据方法一的思想,让x移动即可,注意,如果拼接,它相当于y++,是等效的
  • 3.将所有的StringBuilder拼接起来即可

问题

  • 还是用到了额外的空间,能否直接拼接呢?

官方解法三-直接构造法

算法思想

  • 根据方法一所给的图像,利用里面隐藏的元素下标直接拼接,无需构造

代码实现

class Solution {public String convert(String s, int numRows) {var res = new StringBuilder();var r = numRows;var t = 2 * r - 2;var n = s.length();if (r == 1 || r >= n) {return s;}for (int i = 0; i < r; i++) {for (int j = 0; j + i < n; j += t) {res.append(s.charAt(j + i));if (i < r - 1 && i > 0 && j + t - i < n) {res.append(s.charAt(j + t - i));}}}return res.toString();}
}

代码分析


结论

这道算法题更多的是推导,也没有说具体的用什么有名字的算法,刷刷刷,刷着刷着就会了,我来总结一下的几点

        1.方法一中,[t,r,c,n]概念的深化理解

                2.方法一的代码实现

                        3.方法三的代码实现

        最后,当我们发现某个算法示例呈周期性变化的时候,都可以借鉴此算法

LeetCode琅琊榜第十六层-Z字型变换(直接构造法 + 周期性算法)相关推荐

  1. [LeetCode] Z字型变换

    题目内容: 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:P A H N A P L S I I G Y I R 之后从左往右,逐行读取字符:"P ...

  2. leetcode算法题--Z字型变换

    题目链接:https://leetcode-cn.com/problems/zigzag-conversion/ 用一个二维数组来存储这个字符串,就是按照题目的方式存储,然后按行遍历即可. strin ...

  3. leetcode 6 z字型变换

    执行用时 :64 ms, 在所有 Python3 提交中击败了99.74%的用户 由题目可知 我们的最终字符串会被摆成 numRows 行,那我们理解为 最终结果是numRows个字符串相加 先建立等 ...

  4. LeetCode第六题Z字变换

    将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下: P ...

  5. LeetCode琅琊榜第十二层-寻找峰值(爬坡算法)

    LeetCode162.寻找峰值 难度:中等 博主空间与往期力扣  题目链接 目录 作者原始思路 求最大值法(官方解法一) 题目分析 算法思想 代码实现 代码分析: 官方解法 爬坡算法(方法二) 算法 ...

  6. Z字型变幻,整数反转

    题目1: 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列 ...

  7. 第十六周上机实践—项目2—大数据集上排序算法性能的体验

    /* *Copyright(c) 2015,烟台大学计算机学院 *All rights reserved. *文件名称:test.cpp *作者:林莉 *完成日期:2015年12月18日 *版本:v1 ...

  8. 智简全渠道孟伟:做CRM十六年,企业的一百种死法

    "业内有这么一句话:不上CRM是等死,上CRM是找死.我知道企业上CRM的100种死法."孟伟这样谈他做智简全渠道CRM初衷.他2000年开始从事零售电商信息系统规划设计,精耕16 ...

  9. [Python图像处理] 二十六.图像分类原理及基于KNN、朴素贝叶斯算法的图像分类案例

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

最新文章

  1. 苹果/三星/华为纷纷布局人工智能 将AI作为公司发展新动力
  2. 第一次使用Plesk云主机面板?5招搞定!
  3. C++类构造函数中的成员初始化
  4. Android中获取屏幕的宽和高
  5. TCP服务器:多进程
  6. 东北能源大数据中心正式成立,一期将建设2.4万平方米数据中心
  7. model存储 swift_Swift语言IOS8开发战记10.Data Model
  8. AzCopy – 上传/下载 Windows Azure Blob 文件
  9. 今天的从上往下望去的企业即时通讯
  10. import librosa出错解决方案
  11. Auto CAD 2020 2019 2018 2017 2016 2015 2014 2013 2012 2011 2010 全版本 附带安装教程+入门到精通视频教程
  12. 神策分析中的数据模型
  13. 破解md5加密的方法
  14. 裁员,缩招,冻结HC,程序员如何应对?
  15. 一天看10000张黄图,鉴黄师的苦!!!
  16. vr全景怎么拍摄和制作,3dvr全景制作教程
  17. 信息武器化——认知安全的必要性
  18. iPadPro看电影之MKV转MP4视频格式教程
  19. 【算法•日更•第十九期】动态规划:RMQ问题
  20. 以太坊V神大著:去中心化社会:寻找Web3的灵魂

热门文章

  1. ROS开发之如何使用常用可视化工具?
  2. config:invalid signature 解决办法和问题排查详解
  3. 如何做好网站策划方案
  4. 学完数据分析怎样就业,数据分析发展前景怎么样
  5. 攻防世界 easy-dex解题思路
  6. 出现“Windows无法停用通用卷设备”真实解决办法
  7. 《精解 Windows 10》——2.6 Cortana
  8. 中文字符和英文字符判断
  9. 23届银行秋招:中国银行面试真题解析!
  10. android是什么牌手机参数,Android 获取手机品牌、型号等信息