<6>——ZigZag Conversion

来源:互联网 发布:c语言计算排列组合 编辑:程序博客网 时间:2024/06/05 16:19

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



原创粉丝点击