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 RAnd 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"
.
思路:
1.Z字形的数,第一行和最后一行要单独考虑,中间行需要找规律。
2.
首先可以发现需要用循环来解决。第一行中,下一个数字是7,是第1+3列,第二行中,下一个数字是6,是2+2列,依次类推发现了列的关系是(numRows-1-i)*2
而且还应该是一个列的循环,所以还要定义一个参数j=i。
第一行的规律是:
1 = j
7 = j+ (numRows-1-i)*2 = 1+(5-1-1)*2 = 7
j = j+ (numRows-1)*2
9 = j
15 = j+ (numRows-1-i)*2 =9+(5-1-1)*2=15
下面的每一行依次类推。
代码:
public class Solution {
public String convert(String s, int numRows) {
if (s == null || s.length() <= numRows || numRows <= 1) return s;
StringBuffer sb=new StringBuffer();
//line 1
for(int i=0;i<s.length();i+=2*(numRows-1)) sb.append(s.charAt(i));
//line middle
for(int i=1;i<numRows-1;i++){
for(int j=i;j<s.length();j+=(numRows-1)*2){
sb.append(s.charAt(j));
if((j+(numRows-1-i)*2)<s.length()) sb.append(s.charAt(j+(numRows-1-i)*2));
}
}
//line last
for (int i = numRows - 1; i < s.length(); i += (numRows - 1) * 2) sb.append(s.charAt(i));
return sb.toString();
}
}