题目描述:
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入: s = “LEETCODEISHIRING”, numRows = 3
输出: “LCIRETOESIIGEDHN”
示例 2:
输入: s = “LEETCODEISHIRING”, numRows = 4
输出: “LDREOEIIECIHNTSG”
解释:
L D R
E O E I I
E C I H N
T S G
方法1:
主要思路:
(1)这里主要是在找规律,找到转化为 numRows 行后的Z形后,每行的字符之间的相隔距离;
(2)对于第一行和最后一行特殊处理,因为间隔的方式和其它行不一样;
(3)
class Solution {
public:
string convert(string s, int numRows) {
//处理特殊情形
if(numRows==1)
return s;
if(numRows<1)
return "";
//找最大间隔
int tab=2*numRows-2;
string str;
str.reserve(s.size());//预留空间
int curTab=0;//便于计算当前行的两个不同的间隔
//遍历每一个字符
for(int i=0;i<numRows;++i){
//每行第一个字符在s中的位置
int index=i;
//若是第一行或者最后一行,直接使用最大间隔进行遍历
if(curTab==0||curTab==tab){
while(index<s.size()){//保证不越界
str.push_back(s[index]);
index+=tab;
}
}
else{
//每次循环需要输出两个字符,使用不同的间隔,但间隔之和为最大间隔
while(index<s.size()){
str.push_back(s[index]);
index+=tab-curTab;
if(index<s.size()){
str.push_back(s[index]);
index+=curTab;
}
}
}
//更新当前间隔
curTab+=2;
}
return str;
}
};