——ZigZag Conversion

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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章