题目:
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"
.
解析:考察对字符串的操作,将一个字符串竖着写成nRows行,写成若干个倒着的Z形状,再一行行横着输出。注意下面代码nRows=1的时候,要特别处理,否则会有memory limited exceed的错误。总体做法是依次将每一行添加到输出结果中,对于每一个Z,每行可以添加一个字符或者两个字符,具体情况添加判断条件。
C++ AC代码如下:
class Solution {
public:
string convert(string s, int nRows) {
string result;
if(nRows<2) return s;
int zigSize = 2 * nRows -2;
for(int i=0;i<nRows;i++){
for(int j=i;j<s.length();j+=zigSize){
result.append(1,s[j]);
if(i!=0 && i!=nRows-1 && j + zigSize - 2* i < s.length()){
result.append(1,s[j + zigSize - 2* i]);
}
}
}
return result;
}
};
public String convert(String s, int nRows) {
if (s == null || nRows < 2) {
return s;
}
StringBuffer sb = new StringBuffer();
int zigSize = 2 * (nRows - 1);
for (int i = 0; i < nRows; i++) {
for (int j = i; j < s.length(); j += zigSize) {
sb.append(s.charAt(j));
if (i != 0 && i != nRows - 1
&& zigSize * (j / zigSize) + zigSize - i < s.length()) {
sb.append(s.charAt(zigSize * (j / zigSize) + zigSize - i));
}
}
}
String res = sb.toString();
return res;
}