题意介绍
解题思路
- 解读本题第一想法肯定是遍历数组,但是如何控制数组向下走和向前走是问题所在关键。这里我们将每一行看作一个rows [i](rows 是一个字符串数组)
图中为实例答案,是一个rows[4]的数组,rows[0]=LDR,rows[1]=EOEII,
- 根据上图,我们已得知解题思路,但是难以控制的是空格字符如何判断。这里采用boolean down=false控制字符串遍历时,当down=false的时候,字符串向前走,当down=true的时候,字符串向下走。通过判断条件index= =0||index= =numsRow-1时,则down=true。
- 当down的true时,向下走,如何去控制0<index<numsRows-1范围时的遍历走向。这里通过设置一个index+=down?1:-1,当down为true时,选择+1,当down为false时,则-1,由此可以解决遍历时字符串走向。
本题代码
public class Solution {
public String convert(String s, int numRows) {
//将s的字符串转换为char数组。
char[] chars = s.toCharArray();
//若numRows=1,则s为当前满足条件,直接返回。
if (numRows == 1) {
return s;
}
// length为rows数组的最大长度
int length = Math.min(chars.length, numRows);
//定义一个rows数组,用来存放rows[行]的数据
//该题解题思路为将每一行都看作是数组中的一行字符串,
//例如 z "" "" s 为第一行,则rows[0]="zs";
// f s v m 为第二行,则rows[1]=fsvm;
//最后定义一个字符串ans遍历rows:ans+=rows[i]则为题意所需拼接字符串。
String[] rows = new String[length];
//在使用rows[]数组时,必须先将其设置为“”,否则其内容为null,会报空指针异常
for (int i = 0; i < length; i++) {
rows[i] = "";
}
//设置down为false,第一个元素永远为rows[0],从第二个元素可判断down来确定遍历走向
boolean down = false;
// down为true时index+1,down为false时index-1
int index = 0;
for (int i = 0; i < chars.length; i++) {
rows[index] += chars[i] + "";
//当index为0,或者numRows时down才会转换状态。
if (index == 0 || index ==numRows-1) {
down = !down;
}
//down为true时,index+=1,down为false时index+=-1
index += down ? 1 : -1;
}
String ans = "";
for (int i = 0; i < rows.length; i++) {
ans += rows[i];
}
return ans;
}
}