//将一个给定字符串 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
//
//
// 示例 3:
//
//
//输入:s = "A", numRows = 1
//输出:"A"
//
//
//
//
// 提示:
//
//
// 1 <= s.length <= 1000
// s 由英文字母(小写和大写)、',' 和 '.' 组成
// 1 <= numRows <= 1000
//
// Related Topics 字符串
// 👍 1156 👎 0
先附上公式推导图
搞不懂图片为什么是横着的,不过没太大关系,思路理清楚了代码写起来就顺手多了。
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public String convert(String s, int numRows) {
if(numRows == 1){
return s;
}
StringBuilder r = new StringBuilder();
int len = s.length();
int k = numRows + numRows -2;
int col = len / k + (len % k > 0 ? 2 : 1);
for(int i = 0;i<numRows;i++){
for(int j = 0;j<col;j++){
if(i == 0 || i == numRows -1){
if((i+j*k)<len) {
r.append(s.charAt(i + j * k));
}
}else{
if((i+(j*k-i*2)) < len && j != 0) {
r.append(s.charAt(i + (j*k - i * 2)));
}
if((i+j*k) < len) {
r.append(s.charAt(i + j * k));
}
}
}
}
return r.toString();
}
}
//leetcode submit region end(Prohibit modification and deletion)
最后来个执行效率图吧,虽然每次可能都不太一样