今日算法之_25_Z字形变换
前言
Github:https://github.com/HealerJean
1、Z字形变换
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为
"LEETCODEISHIRING"
行数为 3 时,排列如下:
示例 1:
输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
L C I R
E T O E S I I G
E D H N
示例 2:
输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:
L D R
E O E I I
E C I H N
T S G
1.1、解题思路
画好图形,看看就知道怎么解决了
1.2、算法
public String z(String s, int numRows){
int length = s.length();
if (length <= numRows || numRows == 1){
return s ;
}
//先打印第一行的数据
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(s.charAt(0)) ;
int initWidth = (numRows -1 ) * 2 ;
int j = initWidth ;
for ( ; j < length; j += initWidth){
stringBuilder.append(s.charAt(j)) ;
}
//从第二行开始
for (int i = 1; i < numRows ; i++) {
stringBuilder.append(s.charAt(i)) ;
int width = initWidth - (i * 2);
if (width != 0) {
j = i + width ;
for ( ; j < length; j += width){
stringBuilder.append(s.charAt(j)) ;
width = initWidth - width ;
}
} else {
j = i + initWidth ;
for ( ; j < length; j += initWidth){
stringBuilder.append(s.charAt(j)) ;
}
}
}
return stringBuilder.toString();
}
1.3、测试
@Test
public void test(){
System.out.println(z("AB", 1));
}