题目描述:
The string"PAYPALISHIRING"is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)
P A H N
A P L S I I G
Y I R
And then read line by line:"PAHNAPLSIIGYIR"
Write the code that will take a string and make this conversion given a number of rows:
string convert(string text, int nRows);
convert("PAYPALISHIRING", 3)should return"PAHNAPLSIIGYIR".
题意:n=2时,字符串坐标变成zigzag的走法就是:
0 2 4 6
1 3 5 7
n=3时的走法是:
0 4 8
1 3 5 7 9
2 6 10
n=4时的走法是:
0 6 12
1 5 7 11 13
2 4 8 10 14
3 9 15
思路解析:
- 两层for循环,第一层 i 是行(0到nRows-1),第二层 j 是组(size = 2*nRows-2),两列一组
- 除了第一行和最后一行,其他的行都多一个字符,这个位置的规律是 j+size - 2*i ,也就是前一个下标加上组的长度减去两个i的距离。
- 注意的是:判断字符串空,长度为0,以及nRows为1时,这些特殊情况
- 注意中间的小列需要判断下标是否符合范围
- 可以用StringBuilder来每次增加字符,最后使用StringBuilder.toString()方法转换。
代码:
public class Solution {
public String convert(String s, int nRows) {
if(s==null||s.length()==0||nRows==0)//特殊情况,判空
return "";
if(nRows==1)//特殊情况,行为1
return s;
int size = 2*nRows-2;//整个组的大小
StringBuilder res = new StringBuilder();//可以更改长度
for(int i=0;i<nRows;i++){//行
for(int j=i;j<s.length();j+=size){//组
res.append(s.charAt(j));
if(i!=0 && i!=nRows-1){
int temp = j+size-2*i;
if(temp<s.length())
res.append(s.charAt(temp));
}
}
}
return res.toString();
}
}