目录
- 考察点
- 第一次:2022年12月9日10:58:17
- 解题思路
- 代码展示
题目描述
6. Z 字形变换
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
考察点
逻辑分析:什么时候发生转折?
如何将逻辑分析的思路转化为代码。
字符串API。
第一次:2022年12月9日10:58:17
解题思路
创业未半而中道崩殂。。。。
先说一下自己分析出来的步骤:
-
直觉就是用二维数组来搞,二维数组的行倒是可以搞得出来,也就是字符串长度。列我是真的,死在了这里 (具体查看二维数组的列可以参考:LeetCode 官方题解)。
-
就是判断 转折点:
- 行为 0 ,肯定是转折点,也就是只会变动行(+1 ),不会变动列;
- 列为 字符串行书 -1 的时候,肯定也是转折点,也就是会变动 行(-1) 和 列 (+1)
优秀的解题思路
Z 字形变换(清晰图解)_ Krahets
主要也是对二维数组的优化,因为其实有很多的二维数组中有很多的为null,也就是对二维数组进行压缩。
那么,此时也就是变为了一维数组。
初始化创建一个一维数组肯定简单,大小就是题目要求的字符串的行数。
那么,接下来我们就继续判断转折点:
- 当下标为 0 ,肯定是转折点,也就是 一维数组的下标 +1 ;
- 当下标为 字符串行数量 -1(为什么 -1,是由于Java中的数组从0开始的) 的时候,肯定也是转折点,也就是 一维数组的下标 -1 。
那么。我们就把 +1 与 -1 的操作用一个变量 flag 进行标识。
其中, flag 的初始值,以及特殊情况对 flag 的 改动,用代码简写如下:
flag = -1;
if (index == 0 || index == numRows - 1) {
flag = -flag;
}
思路清晰了,就直接可以用代码自己写出来了。
代码展示
class Solution {
public String convert(String s, int numRows) {
// 不需要处理的特殊情况
if (numRows < 2){
return s;
}
// 初始化一维数组
List<StringBuilder> result = new ArrayList<>();
for(int i = 0; i< numRows ; i++){
result.add(new StringBuilder());
}
//
int index = 0, flag = -1;
for(char c : s.toCharArray()){
// 追加元素
result.get(index).append(c);
// 改变标识位置
if (index == 0 || index == numRows - 1){
flag = -flag;
}
// 通过标识确定一维数组的下标
index += flag;
}
// 将一维数组转化为字符串
StringBuilder str = new StringBuilder();
for (StringBuilder stringBuilder : result) {
str.append(stringBuilder);
}
return str.toString();
}
}