[Leetcode6]Z字形变换

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

python暴力解法:

class Solution(object):
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        n = len(s)
        if n <= numRows or numRows==1:
            return s
        times = n/(numRows-1)
        flag = n%(numRows-1)
        result = ""
        if times%2 == 0:
            s += "0" * (2*numRows-2-flag)
            iters = times/2
            for i in range(numRows):
                if i == 0:
                    for j in range(iters+1):
                        if s[i + j * 2 * (numRows - 1)] != "0":
                            result += s[i + j * 2 * (numRows - 1)]
                elif i < (numRows - 1):
                    left = i
                    right = i + 2 * (numRows - 1 - i)
                    for j in range(iters+1):
                        if s[left + j * 2 * (numRows - 1)] != "0":
                            result += s[left + j * 2 * (numRows - 1)]
                        if s[right + j * 2 * (numRows - 1)] != "0":
                            result += s[right + j * 2 * (numRows - 1)]
                elif i == (numRows - 1):
                    for j in range(iters):
                        result += s[i + j * 2 * (numRows - 1)]             
        if times%2 != 0:
            s += "0" * (numRows-1-flag)
            iters = times -1
            iters = iters / 2
            for i in range(numRows):
                if i == 0:
                    for j in range(iters+1):
                        if s[i + j * 2 * (numRows - 1)] != "0":
                            result += s[i + j * 2 * (numRows - 1)]
                elif i < (numRows - 1):
                    left = i
                    right = i + 2 * (numRows - 1 - i)
                    for j in range(iters+1):
                        if s[left + j * 2 * (numRows - 1)] != "0":
                            result += s[left + j * 2 * (numRows - 1)]
                        if s[right + j * 2 * (numRows - 1)] != "0":
                            result += s[right + j * 2 * (numRows - 1)]
                elif i == (numRows - 1):
                    for j in range(iters+1):
                        if s[i + j * 2 * (numRows - 1)] != "0":
                            result += s[i + j * 2 * (numRows - 1)]
        return result

python优化解法,利用一个指针让其来回遍历:

class Solution(object):
    def convert(self, s, numRows):
        """
        :type s: str
        :type numRows: int
        :rtype: str
        """
        
        if numRows == 1 or numRows >= len(s):
            return s
        
        res = ['']*numRows
        step = 1
        index = 0
        for i in s:
            res[index] += i
            if index == 0:
                step =1
            if index == numRows - 1:
                step = -1
            index += step
        return ''.join(res)

C++:

class Solution {
public:
    string convert(string s, int numRows) {
        int n = s.length();
        if(numRows==1 || numRows>=n){
            return s;
        }
        vector<string> res(numRows);
        int index = 0;
        int step = 1;
        for(int i = 0;i<n;i++){
            res[index]+=s[i];
            if(index == 0){
                step = 1;
            }
            if(index == numRows-1){
                step = -1;
            }
            index += step;
        }
        string result;
        for(int i = 0;i<numRows;i++){
            result+=res[i];
        }
        return result;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_40501689/article/details/82773947