代码测试已过,就是效率有点低,大家可以看看官方的答案(神奇算法)
题目:
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
题目解析:
示例 1:
输入: s = “LEETCODEISHIRING”, numRows = 3
输出: “LCIRETOESIIGEDHN”
示例 2:
输入: s = “LEETCODEISHIRING”, numRows = 4
输出: “LDREOEIIECIHNTSG”
算法思想:定义一个动态数组(防止元素空间不够)然后有规律的将字符串中的元素放入对应的地方,最后依次读取即可 . . .
代码如下:
class Solution {
public:
string convert(string s, int numRows) {
if (numRows == 1) // 行数为1 直接返回
return s;
vector<vector<char> > vecTwoData(numRows); // 存放基于算法获得的每一行数据
int rowCount = 0; // 用于标记 vector的行
int index = 0; // s 的索引
int addNum = 1; // 用于对vector的行的变化控制
while (index < s.size()) // 存放数据
{
vecTwoData[rowCount].push_back(s[index++]);
if (rowCount >= numRows - 1)
addNum = -1;
else if (rowCount <= 0)
addNum = 1;
rowCount += addNum;
}
string str(s);
index = 0;
for (size_t i = 0; i < numRows; i++)
{
for (size_t j = 0; j < vecTwoData[i].size(); j++)
{
str[index++] = vecTwoData[i][j]; // 读取数据用于返回
}
}
return str;
}
};
测试代码:
扫描二维码关注公众号,回复:
11292184 查看本文章
cout << (new Solution())->convert("LEETCODEISHIRING", 5) << endl;
结果如下: