LeetCode 6. Z 字形变换

Posted 咸鱼の小窝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 6. Z 字形变换相关的知识,希望对你有一定的参考价值。

题意

根据给定的行数,将字符串从上到下、从左到右进行Z字形排列,详见样例。

思路

  • 想法1:直接模拟,时间复杂度(O(n))。为什么运行时间只击败了21%的用户,内存消耗却击败了83%的用户?难道有什么空间换时间的方法?
  • 想法2:看了官方题解,并没有。但是,可以通过计算每个位置的数学关系来解答。直接模拟的方法也可以优化为一维数组。时间复杂度(O(n))

代码

  • 代码1(二维数组直接模拟):

    class Solution {
    public:
        string convert(string s, int numRows) {
    
            if(numRows == 1)    return s;
    
            int len = s.size();
            char res[numRows][len];
            memset(res, 0, sizeof(res));
    
            bool flag = true;
            int col = 0, row = 0;
            for(int i = 0; i < len; ++i)
            {
                if(flag)    //down
                {
                    res[row++][col] = s[i];
                    if(row == numRows)
                    {
                        flag = false;
                        --row;  //back
                    }
                }
                else    //up
                {
                    res[--row][++col] = s[i];
                    if(row == 0)
                    {
                        flag = true;
                        --i;
                    }
                }
            }
    
            /*
            for(int i = 0; i < numRows; ++i, puts(""))
                for(int j = 0; j <= col; ++j)
                    cout << res[i][j];
            */
    
            string ans = "";
            for(int i = 0; i < numRows; ++i)
                for(int j = 0; j <= col; ++j)
                    if(res[i][j] != 0)
                        ans.push_back(res[i][j]);
    
            return ans;
        }
    };
  • 代码2(一维数组直接模拟):

  • 代码3(数学关系):

总结

这种关系的一般都会和数学(找关系式?)有关系的,如以前遇到过的“蛇形填数”。

以上是关于LeetCode 6. Z 字形变换的主要内容,如果未能解决你的问题,请参考以下文章

Z字形变换 leetcode 6

leetcode算法:6.Z 字形变换

leetcode 6: Z字形变换

LeetCode 6 Z 字形变换

LeetCode 6. Z 字形变换(中)

LeetCode 6. Z 字形变换(中)