六、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;
}
};