leetcode6.Z 字形转换
个人题解与官方题解二思路相同,但官方题解的代码表达更简洁。
题目
链接: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 字形转换相关推荐
- 6.Z字形转换(ZigZag Conversion)
题目描述 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:(下面这样的形状) P A H N A P L S I I G Y I R 之后按逐行顺序依次排列: ...
- leetcode6. Z 字形变换
将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: L C I ...
- leetcode6 Z字形变换 python
题目: 将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数: P A H N A P L S I I G Y I R之后从左到右"PAHNAPLSIIG ...
- leetcode(6.Z字形转换)【中等】
一.题目 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列 ...
- LeetCode-6:ZigZag Conversion(Z字形变换)
题目: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows l ...
- leetcode题库:6. Z字形变换
题目: /**题目:6. Z字形变换(题目地址:https://leetcode-cn.com/problems/zigzag-conversion/description/) * 将字符串 &qu ...
- 力扣6. Z 字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列.比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下: P ...
- LeetCode 6. Z 字形变换 (N字形变换)
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下: P ...
- 图解LeetCode06:Z字形变换
LeetCode06:Z字形变换 将一个给定字符串s根据给定的行数numRows,以从上往下.从左到右及进行Z字形排列 比如输入字符串为"PAYPALISHIRING"行数为3时, ...
- NC344 Z字形输出字符串
描述 给定一个长度为 n 的字符串和一个指定行数 k ,请你从上到下,从左到右地把这个字符串转换成 z 字形,一共 n 行. 例如输入的字符串是 "nowcoder",k=3,则转 ...
最新文章
- 戴尔推免费浏览器安全工具 可隔离恶意软件
- WebBrowser控件判断完全加载中DocumentCompleted和Navigated的关系
- 关于com.android.support:appcompat-v7:26.0.0以上无法下载的问题
- JAVA题目 写一个收费站类_Java综合题目
- Java 14 发布了,再也不怕NullPointerException 了!?
- 工业富联灯塔工厂白皮书:智能制造里程碑.pdf(附下载链接)
- mifare classic 2.2.3中文_Adobe Lightroom Classic CC 2019 v8.4.1 中文完整直装版
- iframe 实现网页本页显示
- Mybatis3 最简例子
- 最短路大大大跟着合集
- 测试用例(功能用例)——人员管理、资产入库
- 如何重装电脑win10系统 电脑重装Win10系统操作教程
- G1 Concurrent Refinement Thread 在干啥?
- linux usb gadget 日志
- 有声音显示音频服务器,Win7右下角声音图标显示音频服务未运行的解决方法小结...
- 教育行业下半场强势到来!专访FCG教育链Edward Cai:从互联网教学到“链教学”,让天下没有不公平的教育...
- php seekdir,C++_详解C语言中telldir()函数和seekdir()函数的用法,C语言telldir()函数:取得目录流 - phpStudy...
- User Interface Process(UIP) Application Block 2.0 研究总结
- 展馆人流量怎么测算?
- linux 基本命令及用法列子