题目描述:给定一个字符串,将字符串按照Z字形输出指定的行数。
Input: s = "PAYPALISHIRING", numRows = 4
Output: "PINALSIGYAHRPI"
Explanation:
P I N
A L S I G
Y A H R
P I
解题思路:本题是按照一定的规则,按列输出值。如果把整个输出结果映射到一个二维数组上,那我们只需要确认每个坐标是否需要输出值,然后按照这个思路,找到对应的逻辑。 这里有两个需要考虑的点:
1 全值列的位置:全值列是指全部有值的列,两个全值列之间的字符数量是2*(numRows-1)个,第一列一定是全值列,那么每一行第一个值就是当前s.indexOf(当前行号),当前行后面的全值列在字符串中的下标就是 行号+2*(numRows-1),依次递增。
2 两个全值列中间的值:全值列的index-i*2,这个规则很好找,两个值相之间当与一个A字形结构。
class Solution {
public String convert(String s, int numRows) {
if(s.length() <= numRows || numRows==1){
return s;
}
StringBuilder builder=new StringBuilder();
//全数值列之间的字符数量
int step=2*(numRows-1);
//按行取数
for(int i=0 ; i<numRows ; i++){
//初始坐标
int k=0;
//计算下当前位置对应字符串的下标
int index=k * step +i;
//如果下标还在字符串的长度内,添加到结果集
while(index <s.length()){
builder.append(s.charAt(index));
//计算下一个全值列的在字符串中的下标
k++;
index=k * step +i;
//判断当前列和下一个全值列之间,是否有需要打印的字符
//边界条件是,i不是第一行,也不是最后一行
if(i>0 && i< numRows-1){
//计算下中间数据的下标,就是下一个下标减去2*i
int mid=index - i*2;
if(mid < s.length()){
builder.append(s.charAt(mid));
}
}
}
}
return builder.toString();
}
}
运行结果: Runtime: 4 ms, faster than 91.63% of Java online submissions for Zigzag Conversion.
Memory Usage: 44.8 MB, less than 50.32% of Java online submissions for Zigzag Conversion.