6 ZigZig Conversion[M]Z字形变换

题目

给定一个字符串,按指定行数,以从上往下、从左往右进行Z字形排列。
举例:

Input: s= "ABCDEFGHIJKLMNOP",  numRows = 4,
Output:AGMBFHLNCEIKODJP
Explanation:
           A    G    M
           B  F H  L N
           C E  I K  O
           D    J    P

思路:

先将字符串\(s\)进行Z字排列,再按行读取字符。将Z字分为上中下三个部分,则例子的Z上:ABCD,中:EF,下:GHIJ。分析其规律可以发现,对于指定的行数\(n\),中部的个数为\(n-2\),将每一个上+中作为一个循环,则循环周期为\(t=n+n-2\)。于是有
第1行:\(s[0], s[0+t],s[0+2 \cdot t], \cdots ;\)
第2行:\(s[1], s[0+t-1],s[1+t],\cdots;\)
\(\cdots\)
第\(n\)行:\(s[n-1],s[n-1+t],s[n-1+2 \cdot t]\cdots .\)

代码:

  • C++
class solution{
public:
  string convert(string s, int numRows){
    if(s.size()==1) return s;
    string resString;
    int stringLen=s.size();
    int cycleLen=2*numRows-2;

    for(int i=0;i<numRows;i++){
      for(int j=0;j+i<stringLen;j+=cycleLen){
        resString += s[i+j];
        if(i !=0 && i != numRows-1 && j+cycleLen-i < stringLen){
         resString+=s[j + cycleLen - i];
      }
    }
    return resString;
  }
};
  • python
def covert
上一篇:lc6 ZigZag Conversion


下一篇:leetcode119. 杨辉三角2