Java LeetCode每日一题-从易到难带你领略算法的魅力(七):Z 字形变换
生活随笔
收集整理的这篇文章主要介绍了
Java LeetCode每日一题-从易到难带你领略算法的魅力(七):Z 字形变换
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
Z 字形变换
- 1.题目要求
- 2.题目示例
- 3.解题
- 3.1 解题思路
- 3.2 业务代码
- 3.3 运行结果
- 4.优化
- 4.1 优化思路
- 4.2 优化业务代码
- 4.3 优化结果
- 5.总结
1.题目要求
- 将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
- 比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
- 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。
- 请你实现这个将字符串进行指定行数变换的函数:
2.题目示例
- 示例 1:
- 示例 2:
3.解题
3.1 解题思路
3.2 业务代码
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();} }3.3 运行结果
4.优化
4.1 优化思路
4.2 优化业务代码
class Solution {public String convert(String s, int numRows) {if (numRows == 1) return s;StringBuilder ret = new StringBuilder();int n = s.length();int cycleLen = 2 * numRows - 2;for (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));}}return ret.toString();} }4.3 优化结果
5.总结
- 第一种的思路特别直接不用去找规律什么的,但是效率不高
- 第二种需要去耐心的发现规律,总体而言都挺不错的。
- 如果大家有更好的方案欢迎大家在下面留言
总结
以上是生活随笔为你收集整理的Java LeetCode每日一题-从易到难带你领略算法的魅力(七):Z 字形变换的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: siebel编程
- 下一篇: Java LeetCode每日一题-从易