六、ZigZag Conversion
锯齿变换
题目大意:输入一个字符串和int型(锯齿层数)
将字符串以锯齿变化重新排序
例:
“HAIZEIKEJILAOCHUANZHANG",numRows=5
通过如下形式转换:
ret="HJAAEIUNIKLHZGZIACHNEOA";
解析:
周期:z=n+(n-2);
顶层:每周期第一个元素
中间层:
j行左偏差:ld=j;
j行右偏差:rd=z-j;
底层:每周期最后一个元素
我的代码:
class Solution {
public:
string convert(string s, int numRows) {
int N=s.length();
if(N<=numRows||numRows<=1)return s;
int z=numRows+numRows-2;//周期长度
string ret="";
for(int i=0;i<N;i+=z)//锯齿顶层
ret+=s[i];
for(int j=1;j<numRows-1;j++)//中间层
for(int t=0;t<N;t+=z)
{
if(t+j<N)ret+=s[t+j];//左偏差为j
if(t+z-j<N)ret+=s[t+z-j];//右偏差为i
}
for(int i=numRows-1;i<N;i+=z)//锯齿底层
ret+=s[i];
return ret;
}
};
经典代码:
class Solution {
public:
string convert(string s, int numRows) {
string result="";
if(numRows==1)
return s;
int step1,step2;
int len=s.size();
for(int i=0;i<numRows;++i){
step1=(numRows-i-1)*2;
step2=(i)*2;
int pos=i;
if(pos<len)
result+=s.at(pos);
while(1){
pos+=step1;
if(pos>=len)
break;
if(step1)
result+=s.at(pos);
pos+=step2;
if(pos>=len)
break;
if(step2)
result+=s.at(pos);
}
}
return result;
}
};