Category | Difficulty | Likes | Dislikes |
---|
algorithms | Medium (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"
);
}
}
|