1、题目
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 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);
示例 :
输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:
L D R
E O E I I
E C I H N
T S G
题解
分析:
1、每行的开始字符就是处于第i个的字符;行:0~numRows
第0行:L,s[0]
第1行:E,s[1]
第2行:E,s[2]
第3行:T,s[3]
2、第0行和最后一行字符间距为:2*numRows-2
L D R 间距:6---6---6
0 6 12 间距:2*numRows-2
3、第一行字符为:
1--5--7--11--13 间隔:4--2--4--2--
E O E I I, 间隔:step-2*i(行) ---2*i----step-2*i---2*i
4、第二行字符
E C I H N 间隔:2---4---2----4
2 4 8 10 14 间隔:step-2*i(行)---2*i ----step-2*i----2*i
5、下标不能超过字符串长度
string convert(string s, int numRows) {
if(numRows==1)
return s;
string res; //结果保存
int index=0; //每行字符位置
int add = 0; //字符间距
int len = s.length(); //字符串长度
int step = 2*numRows-2;
for(int i=0;i<numRows;i++) //当前行
{
index = i;
add = 2*i;
while(index<len)
{
res+=s[index];
add = step-add; //每行间距
index += (i==0 || i==numRows-1)?step:add; //首行、末行间距相等,相差step
}
}
return res;
}
总结
把抽象的例子具体化,而后找规律,把复杂的问题简单化,通过规律写代码,事半功倍。