leetcode相关C++算法解答: https://github.com/Nereus-Minos/C_plus_plus-leetcode
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。
输入: s = “LEETCODEISHIRING”, numRows = 4 输出: “LDREOEIIECIHNTSG”
(使用二维数组坐中间量)
1.特殊情况:if(s.length() == 0 || s.length() <= numRows || numRows == 1) return s;
2.建立二维数组,存放每行的子串,空字符用空格表示vector
3.最终返回值 char* ret = new char[s.length()+1]; //必须多一个来作为终止符!!!
4.最后需要 //添加终止符 ret[ret_len] = 0;
#if 1
class Solution {
public:
string convert(string s, int numRows) {
//特殊情况,空字符串 特殊情况,numRows==1 特殊情况s长度<=numRows
if(s.length() == 0 || s.length() <= numRows || numRows == 1)
return s;
//思路;建立二维数组,存放每行的子串,空字符用空格表示
vector> a(numRows, vector(s.length()));
char* ret = new char[s.length()+1]; //必须多一个来作为终止符!!!
for(int l = 0, step = 0; s[l] != 0; step++)
{
int line = step % (numRows-1);
for(int i = 0; i < numRows; i++)
{
//终止条件
if(s[l] == 0)
{
line = numRows;
break;
}
//一次分numRows列,
if(line == 0) //第一列
{
a[i][step] = s[l++];
}
else
{
if(i == (numRows - line - 1))
a[i][step] = s[l++];
else
a[i][step] = ' ';
}
}
}
//重构成输出
int ret_len = 0;
for(int m = 0, re=0; m < numRows; m++)
{
for(int n = 0; a[0][n] != 0; n++) //不能用a[0].length()==s.length(),不对
{
if(a[m][n] != ' ' && a[m][n] != 0)
{
ret[re++] = a[m][n];
ret_len++;
}
}
}
//添加终止符
ret[ret_len] = 0;
return ret;
}
};
#endif