题目描述

输入一个宇符串s和正整数numRows,对宇符串s按规则进行波形排列,然后按规则输出新的宇符串。
波形排列规则如下:
1.波峰和波谷的宽度固定为3;
2.波形高度为rowNums;
3.从左到右,从下到上排列rowNums个宇符,从在到右排列3个宇符,从下到上rowNums个字符,以此类推。
宇符串输出规则:
从上到下逐行读取,每行从左到右读取。

例如,输入“ABCDEFGHIJKLMNOPQ”3,
则排列形状如下:
E F G M N O
D H L P
A B C I J K Q
输出
"EFGMNODHLPABCIJKQ"

代码实现

class Solution{
public String convert(String str, int numRows){
int len = str.length();
if(len < 3)return str;
int i = 0;
String[] waves = new String[numRows];
while(i < len){ //思路:while循环内模拟方向
for(int k = 0; k < 2 && i < len; i++, k++){
if(waves[numRows - 1] == null){ //防止拼接成nullA
waves[numRows - 1] = Character.toString(str.charAt(i));
}else{
waves[numRows - 1] += str.charAt(i);
}
}
for(int j = numRows - 1; j > 0 && i < len; i++, j--){
if(waves[j] == null){
waves[j] = Character.toString(str.charAt(i));
}else{
waves[j] += str.charAt(i);
}
}
for(int k = 0; k < 2 && i < len; i++, k++){
if(waves[0] == null){
waves[0] = Character.toString(str.charAt(i));
}else{
waves[0] += str.charAt(i);
}
}
for(int j = 0; j < numRows - 1 && i < len; i++, j++){
if(waves[numRows - 1] == null){
waves[j] = Character.toString(str.charAt(i));
}else{
waves[j] += str.charAt(i);
}
}
}
StringBuilder sb = new StringBuilder();
for(int ii = 0; ii < numRows; ii++){
sb.append(waves[ii]);
}
return sb.toString();
}
}

参考

jiankychen教你学算法 - 学算法,看我就够了