将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码实现:
class Solution {
public:
string convert(string s, int numRows) {
string con;
vector<string> vVec; //记录v字型数组
int nVNum = numRows * 2 - 2; // 一个v字型占的字符数
if (nVNum == 0) //容错
{
return s;
}
//先拆分字符串
size_t i = 0;
size_t nSize = s.length();
for (; i <= nSize; i+= nVNum)
{
if (i != nSize)
{
vVec.push_back(s.substr(i, nVNum));
}
}
//合并字符串
for (int i = 0; i < numRows; ++i)
{
string tmpStr;
size_t nVecSize = vVec.size();
for (size_t j = 0; j < nVecSize; ++j)
{
string v = vVec.at(j);
size_t nVSize = v.size();
if (i < nVSize) //放入直列上的值
{
tmpStr.push_back(v.at(i));
}
size_t nIndex = numRows * 2 - 2 - i;
if (nIndex < nVSize && nIndex >= numRows) //放入斜列上的值
{
tmpStr.push_back(v.at(nIndex));
}
}
con.insert(con.end(), tmpStr.begin(), tmpStr.end());
}
return con;
}
};
看了下官方解答,代码存在很大的优化空间=、=