码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode 6. Z 字形变换

时间:2020-01-02 18:31:45      阅读:63      评论:0      收藏:0      [点我收藏+]

标签:遇到   size   运行时   str   运行   span   for   想法   二维数组   

题意

根据给定的行数,将字符串从上到下、从左到右进行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 字形变换

标签:遇到   size   运行时   str   运行   span   for   想法   二维数组   

原文地址:https://www.cnblogs.com/songjy11611/p/12134441.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!