[LeetCode]6.Z 字形变换
题目描述
方法
个人理解:
- 用
numRows
个StringBuilder对象代表numRows
行 - 使用一个
curRow
变量用于跟踪当前行,用一个goingDown
变量跟踪遍历方向(curRow++还是--
) - 顺序遍历字符串字符,将字符添加到对应的行(StringBuilder对象)中
- 整合所有的行(StringBuilder对象),并输出
class Solution {
public String convert(String s, int numRows) {
//如果行数为1行,返回原字符串
if(numRows == 1) return s;
//定义一个列表用于存储每一行
List<StringBuilder> rows = new ArrayList<>();
//使用min(numRows, s.length()代表非空行数是因为字符串长度可能小于行数
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();
}
}
个人理解:
- 第一行Z型两竖边上的字符间隔为
cycleLen = 2 * numRows - 2
- 用
i
遍历每一行,j
代表第一行Z型竖边上的字符的下标,j+i
代表第i
行Z型竖边上的字符的下标’j+i<n
,每一行两竖边之间只有一个字符,该字符的下标为j + cycleLen - i < n
- 按行遍历,根据
i
添加字符
class Solution {
public String convert(String s, int numRows) {
//字符串长度
int n = s.length();
if(numRows == 1) return s;
//定义字符间隔cycleLen
int cycleLen = 2 * numRows - 2;
//用于存储字符串
StringBuilder res = new StringBuilder();
//两层循环,i代表行数,j代表第一行相隔cycleLen的字符下标,
//j+i代表第i行相隔cycleLen的下标,j+cycleLen - i代表间隔中间的字符
for(int i = 0; i < numRows; i++) {
for(int j = 0; j + i < n; j += cycleLen) {
res.append(s.charAt(j+i));
if(i != 0 && i != numRows - 1 && j + cycleLen - i < n) {
res.append(s.charAt(j + cycleLen - i));
}
}
}
return res.toString();
}
}