• LeetCode 6. Z 字形变换 找规律


    将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。

    比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:

    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
    示例 3:

    输入:s = “A”, numRows = 1
    输出:“A”

    提示:

    1 <= s.length <= 1000
    s 由英文字母(小写和大写)、‘,’ 和 ‘.’ 组成
    1 <= numRows <= 1000

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/zigzag-conversion
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    找规律, 看看哪一部分应该放在循环之中,下面是我的代码

    class Solution {
    public:
        string convert(string s, int numRows) {
            if(numRows == 1) return s;
    
            // 要学会抽象出规律来,看看那些在循环
    
            char m[1010][1010];
            int n = s.size() / ( 2 * numRows - 2 ) + 1;
            memset(m, '0', sizeof(m));
    
            // 记录总的
            int k = 0;
            // 记录列数
            int j = 0;
            for(int i = 0; i < n && k < s.size(); i ++)
            {
                for(int p = 0; p < numRows && k < s.size(); p ++)
                {
                    m[p][j] = s[k ++];
                }
    
                j ++;
                    
                for(int u = numRows - 2; u > 0 && k < s.size(); u --, j ++)
                {
                    m[u][j] = s[k ++];      
                }
                
            }
    
            string res;
            for(int i = 0; i < numRows; i ++)
            {
                for(int p = 0; p < j + 1; p ++)
                {
                    if(m[i][p] != '0') res += m[i][p];
                }
            }
    
            return res;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    这是官方的代码, 设定一个x和y,然后根据不同的情况,让x和y进行不同的操作

    class Solution {
    public:
        string convert(string s, int numRows) {
            int n = s.length(), r = numRows;
            if (r == 1 || r >= n) {
                return s;
            }
            int t = r * 2 - 2;
            int c = (n + t - 1) / t * (r - 1);
            vector<string> mat(r, string(c, 0));
            for (int i = 0, x = 0, y = 0; i < n; ++i) {
                mat[x][y] = s[i];
                if (i % t < r - 1) {
                    ++x; // 向下移动
                } else {
                    --x;
                    ++y; // 向右上移动
                }
            }
            string ans;
            for (auto &row : mat) {
                for (char ch : row) {
                    if (ch) {
                        ans += ch;
                    }
                }
            }
            return ans;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
  • 相关阅读:
    含电热联合系统的微电网运行优化附Matlab代码
    【李宏毅机器学习2021】Task05 网络设计的技巧
    《WEB前端框架开发技术》HTML5响应式旅游景区网站设计与实现——榆林子州HTML+CSS+JavaScript
    如何制作一份优秀的简历?
    Windows 10 远程桌面连接
    Timesnet: Temporal 2d-variation modeling for general time series analysis
    DC-DC模块升压电源直流隔离低压升高压正负输出变换器
    实验三:多种影响因素下购房方案的比较
    Ambire 第一次治理投票:WALLET 质押者选择新的燃烧率和锁定期
    torch.roll
  • 原文地址:https://blog.csdn.net/qq_45766916/article/details/126148999