Related Topics:[String]
Similar Questions
题目: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
可以发现规律,每一个之的长度是 2n-2(n+n-2) (第二列第一行和最后一行少字)。
利用这个规律,可以按行填字。每一行中分为直线列元素和斜线列元素来处理。每一行中的直线列在原字符串中的索引均相差2n-2。而斜线上的元素的索引可由前一个直线列上的元素(即左方元素)的索引求得,即j+(2n-2)-2i(j和i分别为前一元素的列和行)。
在第一行和最后一行中,只存在直线列元素。其他行中两种元素交叉分布。
按照上面的规律就可以写出代码了。
java解法:
class Solution {
public String convert(String s, int numRows) {
if(numRows<=1) return s;
int size=2*numRows-2;
String res="";
for(int i=0;i<numRows;i++) {
for(int j=i;j<s.length();j+=size) {
res+=s.charAt(j);
int tmp=j+size-2*i;
if(i!=0&&i!=numRows-1&&tmp<s.length()) res+=s.charAt(tmp);
}
}
return res;
}
}
网友评论