Z 字形变换
思路:刚刚开始是没有思路,被中间表现的空格给误导了。冷静分析:(下标–行数)
例如 行数为3:
0-0 ,1-1 ,2-2 ,3-1;
4-0 ,5-1 ,6-2 ,7-1;
行数为4:
0-0 ,1-1 ,2-2, 3-3 ,4-2, 5-1,6-0
根据分析,循环的一组数量为 2行数-2
根据取余求当前字符所在的行数,当余数大于行数时,满足 应在行数=循环一组数-余数
比如 行数为:3 (0,1,2) 一组循环为:23-2=4;
下标为1所在行= 1%41 (1-1)
下标为3所在行= 3%43,判断3大于行数?(最大行数为2,因为从0开始),所以 所在行=循环-余数=4-3=1 (3-1)
同理4行如此!
最后循环拼接字符!
代码如下
class Solution {
public:
string convert(string s, int numRows) {
if(numRows==1)
{
return s;
}
int max=1000;
if(max>numRows)
{
max=numRows;
}
string shuzu[max];
int xunhuan= 2*numRows-2;
int hang=0;
for(int i=0;i<s.size();++i)
{
hang=i%xunhuan;
if (hang>numRows-1)
{
hang=xunhuan - hang;
}
shuzu[hang]+=s[i];
}
string temp{};
for(int i=0;i<max;++i)
{
temp+=shuzu[i];
}
return temp;
}
};
大佬思路:只需要判断当前存的位置是不是开头或者结尾!!(开头)0.,(结尾)行数-1;
bool 方向=1
int hang=0
如果是开头,将方向等于1,每次填的位置为[hang+方向];
如果是结尾,将方向等于-1,每次填的位置为[hang+方向];