LeetCode 6. ZigZag Conversion

本文介绍了一种将字符串以Z形方式排列并按行读取的算法实现。通过数学规律解析,给出了针对不同行数的Z形排列方法,并提供了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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”.

分析:

要找到数学规律。

n=4:
P     I     N
A   L S   I G
Y A   H R
P     I

n=5:
P       H
A     S I
Y   I   R
P L     I G
A       N

所以,对于每一层垂直元素的坐标(i, j) = (2 * n - 2) * j + i
对于没两层垂直元素之间的插入元素(斜对角元素),(i , j ) = index + (n - i - 1) * 2。
index为该行前一个垂直元素的索引值。

举例:
n = 4时,
坐标为(0, 1)的垂直元素I的索引值index = (2 * 4 - 2) * 1 + 0 = 6, 即s[index]=s[6]=”I”;
坐标为(2, 1)的斜对角元素A的索引值index = Y的索引值 + (4 - 2 - 1) * 2 = 2 + 2 = 4, 即s[4] = “A”;

注意:首尾两行元素全为垂直元素。

string convert(string s, int nRows) {
    if (nRows <= 1 || s.size() <= 1) return s;
    string result;
    for (int i = 0; i < nRows; i++)
    {
        for (int j = 0, index = i; index < s.size();
            j++, index = (2 * nRows - 2) * j + i) {
                result.append(1, s[index]);         // 垂直元素
                if (i == 0 || i == nRows - 1) continue; // 斜对角元素
                if (index + (nRows - i - 1) * 2 < s.size())
                    result.append(1, s[index + (nRows - i - 1) * 2]);
        }
    }

    return result;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值