这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战
1.leetcode Z字形变换 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入: s = "PAYPALISHIRING", numRows = 3
输出: "PAHNAPLSIIGYIR"
示例 2:
输入:s = "PAYPALISHIRING", numRows = 4
输出:"PINALSIGYAHRPI"
解释:
P I N
A L S I G
Y A H R
P I
解题:
可以理解为字符串是按V字型追加的,V字的高度就是numRows,可以定义一个字符串数组,然后依次从上到下,从下到上的反复往行字符串追加字符。假如行数是3,依个遍历字符串s,那么第一个字符追加到第一行的字符串,第二个字符追加到第二行的字符串,第三个字符追加到第三行的字符串,此时已经到达最大行数了,第四个字符串就往上去第二行字符串追加,第五个字符串就追加到第一行,这个时候也就到达最开始的位置了,第六个字符串就又需要往下一行追加,如此反反复复直到字符串遍历完,最后将整个数组从上到下拼接成一行就行了。
public String convert(String s, int numRows) {
if (numRows == 1) {
return s;
}
// 定义初始化字符串数组
StringBuilder[] strArr = new StringBuilder[numRows];
for (int i = 0; i < numRows; i++) {
strArr[i] = new StringBuilder();
}
// 代表数组下标
int index = 0;
// 是否到头了
boolean top = true;
for (int i = 0; i < s.length(); i++) {
// 往数组数组里面添加字符
strArr[index].append(s.charAt(i));
// 如果在第一行 那么应该是往下 ++
if (index == 0) {
top = true;
}
// 如果在最后一行 那么应该是往上 --
if (index == numRows - 1) {
top = false;
}
// 依次从第一行追加到最后一行,从最后一行追加到第一行,反反复复
index = top ? index + 1 : index - 1;
}
// 将数组从左到右,从上到下拼接成一行
StringBuilder res = new StringBuilder();
for (int i = 0; i < numRows; i++) {
res.append(strArr[i]);
}
return res.toString();
}