Question
Link : https://leetcode.com/problems/zigzag-conversion/
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”.
Code
额,感觉这个比较挫的算法空间复杂度有点高,为O(n),同时时间复杂度也为O(n)。(C++ : 72ms)
class Solution {
public:
string convert(string s, int numRows) {
if(numRows == 1)
return s;
vector<vector<char>> rows;
for(int i = 0; i < numRows; i++){
vector<char> temp;
rows.push_back(temp);
}
int index = 0, dir = 0; // dir == 0 means down, or up;
string res;
for(int i = 0; i < s.size(); i++){
rows[index].push_back(s[i]);
if(dir == 0){
if(++index == (numRows - 1))
dir = 1;
}
else{
if(--index == 0)
dir = 0;
}
}
for(int i = 0; i < numRows; i++)
for(int j = 0; j < rows[i].size(); j++)
res.push_back(rows[i][j]);
return res;
}
};
一个高级点的方式,直接计算结果值。(C++ : 20ms)
class Solution {
public:
string convert(string s, int numRows) {
string str;
if(numRows == 1) return s;
int i, j, k, size = s.size();
for(i = 0; i < numRows; i++){
for(k = 0, j = i; j < size;){
j = (numRows - 1) * k - i;
if(j >= size) break;
str.push_back(s[j]);
j = (numRows - 1) * k + i;
if(j >= size) break;
if(i != 0 && i != (numRows - 1))
str.push_back(s[j]);
k += 2;
}
}
return str;
}
};