leetcode 6、Z字形变换

将字符串 "PAYPALISHIRING" 以Z字形排列成给定的行数:

P   A   H   N
A P L S I I G
Y   I   R

之后从左往右,逐行读取字符:"PAHNAPLSIIGYIR"

实现一个将字符串进行指定行数变换的函数:

string convert(string s, int numRows);

示例 1:

输入: s = "PAYPALISHIRING", numRows = 3
输出: "PAHNAPLSIIGYIR"

示例 2:

输入: s = "PAYPALISHIRING", numRows = 4
输出: "PINALSIGYAHRPI"
解释:

P     I    N
A   L S  I G
Y A   H R
P     I

code

class Solution {
public:
    string convert(string s, int numRows) {
        int r = numRows;
        int len = s.length();
        string str;
        if(r==1 || r>=len) return s;
        else if(r==2){
            for(int i=0;i<len;i+=2)
                str.push_back(s[i]);
            for(int i=1;i<len;i+=2)
                str.push_back(s[i]);
            return str;
        }
        if(r<len && r>2)
            for(int i=0;i<r;i++){      //i is row
                str.push_back(s[i]);
                if(i==0)
                    for(int j=2;j*(r-1)<len;j+=2)   //j is cloumn
                        str.push_back(s[j*(r-1)]);
                else if(i==(r-1))
                    for(int j=3;j*(r-1)<len;j+=2)
                        str.push_back(s[j*(r-1)]);
                else
                    for(int j=1;2*j*(r-1)-i<len;j++){
                        int num = 2*j*(r-1)-i;
                        str.push_back(s[num]);
                        if(num + 2*i <len)
                            str.push_back(s[num + 2*i]);
                }
            }
        return str;
    }
};

采用按行访问,每个元素访问一次,时间复杂度为O(n).

猜你喜欢

转载自blog.csdn.net/kirito0104/article/details/81268433