题目:
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
描述:
将字符串的元素排列成指定行数的z字形,返回行序优先的字符串排列结果
分析:
其实没什么说的,就是个找规律,大模拟...
手写一下各个位置元素的下标,就能发现元素访问的规律了,注意比较坑的是特殊值(1行的时候)判断和首行尾行的处理。
虽然程序中用了两个循环,但是实际上每个元素只访问一次,因此时间复杂度为O(n),其中n为目标字符串长度。
贡献两组比较坑的数据:
//case 1
"123"
5
// case 2
"123"
1
代码:
class Solution {
public:
string convert(string s, int numRows) {
if (numRows == 1) {
return s;
}
string result;
int dis = (numRows - 1) * 2;
int mid = dis;
for (int i = 0; i < numRows; ++i) {
int index = i;
if (index >= s.size()) {
break;
}
result.push_back(s.at(index));
while (index < s.length()) {
index += mid;
if (mid != 0 && index < s.length()) {
result.push_back(s.at(index));
}
if (mid == dis) {
continue;
} else {
index += dis - mid;
}
if (index < s.length()) {
result.push_back(s.at(index));
}
}
mid -= 2;
}
return result;
}
};