题目:
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"
.
题解:
每一个循环是2*nRows-2个字符,是关键。
class Solution {
public:
string convert(string s, int nRows) {
if(nRows == 1)
return s;
vector<string> rows(nRows, "");
int i = 0;
while(i < s.length()) {
int j = i % (2 * nRows - 2);
if(j >= nRows)
j = nRows - 1 - (j % (nRows - 1));
rows[j].append(1, s[i]);
i++;
}
string result = "";
for(int k = 0; k < nRows; k++)
result.append(rows[k]);
return result;
}
};
网上学来空间复杂度O(1)解法:
class Solution {
public:
string convert(string s, int nRows) {
if(nRows == 1)
return s;
string result = "";
int size = nRows * 2 - 2;
for(int i = 0; i < nRows; i++) {
for(int j = i; j < s.length(); j+=size) {
result.append(1, s[j]);
if(j + size - (i % nRows) * 2 < s.length() && size != (i % nRows) * 2 && i % nRows!= 0)
result.append(1, s[j + size - i % nRows * 2]);
}
}
return result;
}
};
Java版:
public class Solution {
public String convert(String s, int nRows) {
if(nRows == 1)
return s;
int size = 2 * nRows - 2;
StringBuilder result = new StringBuilder();
for(int i = 0; i < nRows; i++)
for(int j = i; j < s.length(); j += size) {
result.append(s.charAt(j));
if(i != 0 && i != nRows-1 && j + size - (i % nRows) * 2 < s.length())
result.append(s.charAt(j + size - (i % nRows) * 2));
}
return result.toString();
}
}
Python版:
class Solution:
# @return a string
def convert(self, s, nRows):
if nRows == 1:
return s
result = ""
size = 2 * nRows - 2
for i in range(0, nRows):
for j in range(i, len(s), size):
result += s[j]
if i != 0 and i != nRows-1 and j + size - (i % nRows) * 2 < len(s):
result += s[j + size - (i % nRows) * 2]
return result