LeetCode | 6. ZigZag Conversion(之字形变换)

82 篇文章 0 订阅
23 篇文章 0 订阅

The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility)

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

And then read line by line: “PAHNAPLSIIGYIR”
Write the code that will take a string and make this conversion given a number of rows:

string convert(string text, int nRows);

convert(“PAYPALISHIRING”, 3) should return “PAHNAPLSIIGYIR”.

解题思路:两种.最初想到的是开一个数组,每次像蛇形矩阵一样对数组赋值,最后对每一行每一列遍历,提取出不是空的字符.125ms,几乎是所有题叫中所有提交中最慢的之一了.
第二种,找规律,直接按0~r行,空间复杂度为O(1).29ms(参考LeetCode代码)
虽然这两个算法的复杂度都是O(n),时间差别还挺大.
/*n=numRows
Δ=2n-2 1 2n-1 4n-3
Δ= 2 2n-2 2n 4n-4 4n-2
Δ= 3 2n-3 2n+1 4n-5 .
Δ= . . . . .
Δ= . n+2 . 3n .
Δ= n-1 n+1 3n-3 3n-1 5n-5
Δ=2n-2 n 3n-2 5n-4
*/

//125ms
class Solution {
public:
    string convert(string s, int r) 
    {
        int len = s.length();
        string res = "";
        if (r == 1)
            return s;
        else if (r == 2)
        {
            for (int i = 0; i < len; i += 2)
                res += s[i];
            for (int j = 1; j < len; j += 2)
                res += s[j];
            return res;
        }
        char chess[1000][1000] = {};
        for (int i = 0; i < r; i++)
            for (int j = 0; j < len; j++)
                chess[i][j] = ' ';//初始化

        int it = 0, row = 0, col = 0;
        while (it < len)
        {
            chess[row][col] = s[it];
            if (row == 0)
                row++;
            else if (row == r - 1)
            {
                row--; col++;
            }
            else if (col % (r - 1) == 0)
                row++;
            else
            {
                row--; col++;
            }
            it++;
        }

        for (int i = 0; i < r; i++)
            for (int j = 0; j <= col; j++)
                if (chess[i][j] != ' ')
                    res += chess[i][j];

        return res;
    }
};
//29ms
class Solution {
public:
    string convert(string s, int r) 
    {


        string result = "";
        if (r == 1)
            return s;
        int step1, step2;
        int len = s.size();
        for (int i = 0; i<r; ++i) 
        {
            step1 = (r - i - 1) * 2;
            step2 = (i) * 2;
            int pos = i;
            if (pos<len)
                result += s[pos];
            while (1) 
            {
                pos += step1;
                if (pos >= len)
                    break;
                if (step1)
                    result += s[pos];
                pos += step2;
                if (pos >= len)
                    break;
                if (step2)
                    result += s[pos];
            }
        }
        return result;
    }

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值