OJ练习第23题——Z字形变换
- 题目要求
- 示例
- Java代码如下:
- 思路分析
力扣链接:Z字形变换
题目要求
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);
示例
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“PAHNAPLSIIGYIR”。
输入:s = “PAYPALISHIRING”, numRows = 3
输出:“PAHNAPLSIIGYIR”
Java代码如下:
class Solution {
public String convert(String s, int numRows) {
int len = s.length();
StringBuilder res = new StringBuilder();
res.append(s.charAt(0));
int x;
if(numRows == 1) {
return s;
}
else {
x = 2 + 2 * (numRows - 2);
}
for(int j = 0;j < numRows; j++) {
for(int i = 0; i * x - j < len;i++) {
if(i * x - j > 0 && j < numRows - 1) {
res.append(s.charAt(i * x - j));
}
if(j > 0 && i * x + j < len) {
res.append(s.charAt(i * x + j));
}
}
}
return res.toString();
}
}
思路分析
上面这段Java代码是采用直接拼接的方法,一步到位。
1、由于题目明确提示给定字符串长度最小为1,因此不必考虑字符串为空的情况,只单独列出当字符串只有一个字符时,直接返回s。
2、本题思路时直接找规律的方法,将按Z字形划分成组。以示例为例,如下图所示:
上图是numRows为3,再看下图为numRows为4:
x就代表每一组里面字符个数。
每一组里面,除了第一行和最后一行,中间每行会有两个字符,
第一行和最后一行肯定是只有一个字符,一共就是2。
所以:
x = 2 + 2 * (numRows - 2);
所以下面的两个for循环也就是按照这个规律直接将原字符串中的字符拿出来组合成一个新的字符串。