描述
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。
请你实现这个将字符串进行指定行数变换的函数
示例 1:
输入: s = “LEETCODEISHIRING”, numRows = 3
输出: “LCIRETOESIIGEDHN”
示例 2:
输入: s = “LEETCODEISHIRING”, numRows = 4 输出: “LDREOEIIECIHNTSG”
解释:
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
以示例二为例,就是把Z字形的各个字符在原字符串中的位置写上,然后找规律就是了
1、numRow - 2 就是斜着的字符的个数
2、span = numRow + (numRow - 2) 就是竖直字符的跨度
3、span - (i - 2) 就是斜着的与上一个竖直的之间的跨度
public static String convert(String s, int numRows) {
int span1 = numRows + (numRows - 2);
if (span1 == 0) {
return s;
}
StringBuilder str = new StringBuilder();
for (int i = 1; i <= numRows; i++) {
if (i == 1 || i == numRows) {
int temp = i-1;
while (temp < s.length()) {
str.append(s.charAt(temp));
temp += span1;
}
} else {
int span2 = span1 - (i - 2);
int temp1 = i - 1;
int temp2 = span2 - 1;
while (temp1 < s.length()) {
str.append(s.charAt(temp1));
if (temp2 < s.length()) {
str.append(s.charAt(temp2));
}
temp2 += span1;
temp1 += span1;
}
}
//System.out.println(str);
}
return String.valueOf(str);
}