题目:
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; } };
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; } };
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(); } }
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