Z 字形变换

Z 字形变换

CategoryDifficultyLikesDislikes
algorithmsMedium (45.86%)564-

Tags

string

Companies

Unknown

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

比如输入字符串为  "LEETCODEISHIRING"  行数为 3 时,排列如下:

1
2
3
L   C   I   R
E T O E S I I G
E   D   H   N

之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"

请你实现这个将字符串进行指定行数变换的函数:

1
string convert(string s, int numRows);

示例  1:

1
2
输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"

示例  2:

1
2
3
4
5
6
7
8
输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:

L     D     R
E   O E   I I
E C   I H   N
T     S     G

Discussion | Solution

解法

 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
struct Solution;

// @lc code=start
impl Solution {
    /// ## 解题思路
    /// -
    pub fn convert(s: String, num_rows: i32) -> String {
        let n = num_rows;
        let it = (0..n).into_iter().chain((1..n - 1).rev().into_iter());
        let mut vr: Vec<Vec<char>> = vec![vec![]; n as usize];
        s.chars()
            .zip(it.cycle())
            .for_each(|(c, i)| vr[i as usize].push(c));

        vr.into_iter().flatten().collect()
    }
}
// @lc code=end
//
#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test() {
        assert_eq!(
            Solution::convert("LEETCODEISHIRING".into(), 4),
            "LDREOEIIECIHNTSG"
        );
    }
}

updatedupdated2024-08-252024-08-25