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 s, int numRows);
Example 1:
Input: s = "PAYPALISHIRING", numRows = 3 Output: "PAHNAPLSIIGYIR"
Example 2:
Input: s = "PAYPALISHIRING", numRows = 4 Output: "PINALSIGYAHRPI" Explanation: P I N A L S I G Y A H R P I
Use the
std::vector::vector(count, value)constructor that accepts an initial size and a default value:std::vector<std::vector<int> > fog( A_NUMBER, std::vector<int>(OTHER_NUMBER)); // Defaults to zero initial value
If a value other zero, say
4for example, was required to be the default then:std::vector<std::vector<int> > fog( A_NUMBER, std::vector<int>(OTHER_NUMBER, 4));
I should also mention uniform initialization is introduced in C++11, which permits the initialization of
vector, and other containers, using{}:std::vector<std::vector<int> > fog { { 1, 1, 1 }, { 2, 2, 2 } };
AB.reserve( A.size() + B.size() ); // preallocate memory AB.insert( AB.end(), A.begin(), A.end() ); AB.insert( AB.end(), B.begin(), B.end() );
my code:
class Solution {
public:
string convert(string s, int numRows) {
if (numRows == 1) return s;
int len = s.length();
vector<vector<char> > v(numRows, vector<char>());
string ans = "";
int t = 0, dir = 1;
for (int i = 0; i < len; ++i) {
v[t].push_back(s[i]);
t += dir;
if (t >= numRows) {
dir = -1;
t -= 2;
}
if (t < 0) {
dir = 1;
t = 1;
}
}
for (int i = 0; i < numRows; ++i) {
for (int j = 0; j < v[i].size(); ++j) {
ans += v[i][j];
}
}
return ans;
}
};
Runtime: 24 ms, faster than 56.90% of C++ online submissions for ZigZag Conversion.
原文:https://www.cnblogs.com/ruruozhenhao/p/9719997.html