继续打卡算法题,今天学习的是第LeetCode的第6题N字形变换,这道题目是道中等题。算法题的一些解题思路和技巧真的非常巧妙,每天看一看算法题和解题思路,我相信对我们的编码能力有一些帮助。
分析一波题目
给定一个字符串,需要将它按照指定的行数生成一个N字形的排列,这个题目也有技巧,如果我们想按一行一行生成会非常麻烦,但是按照一列一列生成就非常容易理解,并且代码也比较容易理解。
比如PAYPALISHIRING
,指定行数是3。
第一列 从0行开始,构造第一列的
P
A
Y
第二列 这里需要注意,第一列到到最后一个了,根据n字的特性,第二列需要行数转换
P
第3列 这里又从0行开始了,构造第3列的数据
A
L
I
编码解决
class Solution {
public String convert(String s, int numRows) {
if(numRows < 2) return s;
//记录每一行的字符串
List<StringBuilder> rows = new ArrayList<StringBuilder>();
for(int i = 0; i < numRows; i++) rows.add(new StringBuilder());
//i控制行数
int i = 0, flag = -1;
for(char c : s.toCharArray()) {
rows.get(i).append(c);
//到达了最大行或者最小行,需要转换行数了
if(i == 0 || i == numRows -1) flag = - flag;
i += flag;
}
StringBuilder res = new StringBuilder();
for(StringBuilder row : rows) res.append(row);
return res.toString();
}
}
总结
这个题目是按照模拟的做法,主要是注意控制行数的转换逻辑,什么时候行要从0行开始,什么时候行数要往0行靠近。