个人题解与官方题解二思路相同,但官方题解的代码表达更简洁。

题目

链接:https://leetcode-cn.com/problems/zigzag-conversion

官方题解一:按行排序

思路

通过从左向右迭代字符串,我们可以轻松地确定字符位于 Z 字形图案中的哪一行。

算法

我们可以使用 min(numRows,len(s))个列表来表示 Z 字形图案中的非空行。

从左到右迭代 s,将每个字符添加到合适的行。可以使用当前行当前方向这两个变量对合适的行进行跟踪

只有当我们向上移动到最上面的行或向下移动到最下面的行时,当前方向才会发生改变。

class Solution {public String convert(String s, int numRows) {if (numRows == 1) return s;List<StringBuilder> rows = new ArrayList<>();for (int i = 0; i < Math.min(numRows, s.length()); i++)rows.add(new StringBuilder());int curRow = 0;boolean goingDown = false;for (char c : s.toCharArray()) {rows.get(curRow).append(c);if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;curRow += goingDown ? 1 : -1;}StringBuilder ret = new StringBuilder();for (StringBuilder row : rows) ret.append(row);return ret.toString();}
}

复杂度分析

时间复杂度:O(n),其中 n==len(s)
空间复杂度:O(n)

作者:LeetCode
链接:https://leetcode-cn.com/problems/zigzag-conversion/solution/z-zi-xing-bian-huan-by-leetcode/
来源:力扣(LeetCode)

代码(带注释)

import java.util.ArrayList;
import java.util.List;/*** leetcode-6-middle*/
public class zigzag_conversion {static class Solution {/*** 个人题解* 思路:1、同一行的竖列上的字符之间间隔和斜列上的字符之间的间隔均为gap,依次拼接成结果字符串;*         2、第一行和最后一行只有竖列没有斜列*/String convert(String s, int numRows) {if(numRows >= s.length() || numRows == 1) return s;int gap = 2 * numRows - 2;                 //每列两个对应元素的间隔StringBuilder ans = new StringBuilder();   //存储结果值的StringBuilder对象for(int i = 1; i <= numRows; i++){         //对每行进行遍历int m = i;                             //java中每次循环不会重置i的值,所以内部对i的值进行修改的话会影响循环控制if( m == 1 || m == numRows){           //第一行和最后一行只需根据第一个元素的位置依次累加gap即可while (m <= s.length()) {ans.append(s.charAt(--m));m += gap + 1;//因为检索时减去了1所以需要加回来}continue;}int j = 2 * numRows - m;                // j用来表示处于两竖列之间的元素的位置while(m <= s.length() || j <= s.length()){if(m <= s.length()) {ans.append(s.charAt(--m));m += gap + 1;}if(j <= s.length()) {ans.append(s.charAt(--j));j += gap + 1;}}}return ans.toString();}/*** 官方题解二,思路与上同,但表达更简洁* @param s:需要转换的字符串* @param numRows : 指定Z字形的最大行数* @return 返回Z字形转换后按行重组的字符串*/String convertBetter(String s, int numRows) {if (numRows == 1) return s;StringBuilder ret = new StringBuilder();int n = s.length();int cycleLen = 2 * numRows - 2;     //即gapfor (int i = 0; i < numRows; i++) {for (int j = 0; j + i < n; j += cycleLen) {ret.append(s.charAt(j + i));        //竖列上的字符放入结果集if (i != 0 && i != numRows - 1 && j + cycleLen - i < n)ret.append(s.charAt(j + cycleLen - i));     //根据竖列上的字符与同行相邻的斜列上的字符的数量关系,得出j的位置}}return ret.toString();}/*** 官方题解一* 思路: 沿着Z字形依次遍历,将每个字符放入其行对应的StringBuilder对象中*/String convertA(String s, int numRows) {if (numRows == 1 || numRows >= s.length()) return s;List<StringBuilder> rows = new ArrayList<>();    //存储用以顺序每行字符的StringBuilder对象for (int i = 0; i < Math.min(numRows, s.length()); i++)    //初始化rows.add(new StringBuilder());int curRow = 0;                //从第一行开始boolean goingDown = false;     //用以表示当前方向是向上遍历还是向下遍历,由于每次首行和尾行需要置否所以初值为for (char c : s.toCharArray()) {rows.get(curRow).append(c);if (curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;   //第一行和最后一行需要改变方向curRow += goingDown ? 1 : -1;   //正在向下走则行数递增,向上走行数递减}StringBuilder ret = new StringBuilder();for (StringBuilder row : rows) ret.append(row);return ret.toString();}}}

leetcode6.Z 字形转换相关推荐

  1. 6.Z字形转换(ZigZag Conversion)

    题目描述 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:(下面这样的形状) P A H N A P L S I I G Y I R 之后按逐行顺序依次排列: ...

  2. leetcode6. Z 字形变换

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

  3. leetcode6 Z字形变换 python

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

  4. leetcode(6.Z字形转换)【中等】

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

  5. LeetCode-6:ZigZag Conversion(Z字形变换)

    题目: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows l ...

  6. leetcode题库:6. Z字形变换

    题目: /**题目:6. Z字形变换(题目地址:https://leetcode-cn.com/problems/zigzag-conversion/description/)  * 将字符串 &qu ...

  7. 力扣6. Z 字形变换

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

  8. LeetCode 6. Z 字形变换 (N字形变换)

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

  9. 图解LeetCode06:Z字形变换

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

  10. NC344 Z字形输出字符串

    描述 给定一个长度为 n 的字符串和一个指定行数 k ,请你从上到下,从左到右地把这个字符串转换成 z 字形,一共 n 行. 例如输入的字符串是 "nowcoder",k=3,则转 ...

最新文章

  1. 戴尔推免费浏览器安全工具 可隔离恶意软件
  2. WebBrowser控件判断完全加载中DocumentCompleted和Navigated的关系
  3. 关于com.android.support:appcompat-v7:26.0.0以上无法下载的问题
  4. JAVA题目 写一个收费站类_Java综合题目
  5. Java 14 发布了,再也不怕NullPointerException 了!?
  6. 工业富联灯塔工厂白皮书:智能制造里程碑.pdf(附下载链接)
  7. mifare classic 2.2.3中文_Adobe Lightroom Classic CC 2019 v8.4.1 中文完整直装版
  8. iframe 实现网页本页显示
  9. Mybatis3 最简例子
  10. 最短路大大大跟着合集
  11. 测试用例(功能用例)——人员管理、资产入库
  12. 如何重装电脑win10系统 电脑重装Win10系统操作教程
  13. G1 Concurrent Refinement Thread 在干啥?
  14. linux usb gadget 日志
  15. 有声音显示音频服务器,Win7右下角声音图标显示音频服务未运行的解决方法小结...
  16. 教育行业下半场强势到来!专访FCG教育链Edward Cai:从互联网教学到“链教学”,让天下没有不公平的教育...
  17. php seekdir,C++_详解C语言中telldir()函数和seekdir()函数的用法,C语言telldir()函数:取得目录流 - phpStudy...
  18. User Interface Process(UIP) Application Block 2.0 研究总结
  19. 展馆人流量怎么测算?
  20. linux 基本命令及用法列子

热门文章

  1. 2种方式!带你快速实现前端截图
  2. matlab的发展历史,仿真的发展历程以及目前现状
  3. Mysql索引优化和锁机制
  4. file上传代码 ios_自己动手写一个 iOS 网络请求库(四)——快速文件上传
  5. 风变编程python课_聊一聊风变编程Python线上课程
  6. netware显示没有首选服务器,NetWare下服务器配置几例
  7. 解析车辆VIN码识别(车架号识别)系统
  8. 什么是SYN包 以及SYN攻击原理
  9. Flutter 网络请求王者 Dio 应用简介
  10. 福禄克CFP2-100-Q与OFP2-100-Q区别