6. Z 字形变换(leetcode力扣算法 - java / rust)
Posted 二当家的白帽子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6. Z 字形变换(leetcode力扣算法 - java / rust)相关的知识,希望对你有一定的参考价值。
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
原题传送门
题解
java
class Solution {
public String convert(String s, int numRows) {
if (numRows == 1) return s;
StringBuilder ret = new StringBuilder();
int n = s.length();
int cycleLen = 2 * numRows - 2;
for (int i = 0; i < numRows; i++) {
for (int j = 0; j + i < n; j += cycleLen) {
ret.append(s.charAt(j + i));
if (i != 0 && i != numRows - 1 && j + cycleLen - i < n)
ret.append(s.charAt(j + cycleLen - i));
}
}
return ret.toString();
}
}
rust
impl Solution {
pub fn convert(s: String, num_rows: i32) -> String {
if num_rows == 1 { return s; }
let num_rows = num_rows as usize;
// 结果
let mut ret = String::with_capacity(s.len());
// 输入字符串的长度
let n = s.len();
// 一次循环串的长度
let cycle_len = 2 * num_rows - 2;
// 将字符串转为字符Vec
let s = s.chars().into_iter().collect::<Vec<char>>();
// 注意字符串长度小于行数的问题
for i in 0..num_rows.min(n) {
(0..n - i).step_by(cycle_len).for_each(|j| {
ret.push(s[j + i]);
if i != 0 && i != num_rows - 1 && j + cycle_len - i < n {
ret.push(s[j + cycle_len - i]);
}
});
}
ret
}
}
最后说两句
非常感谢你阅读本文章,如果你觉得本文对你有所帮助,请留下你的足迹,点个赞,留个言,多谢~
作者水平有限,如果文章内容有不准确的地方,请指正。
希望小伙伴们都能每天进步一点点。
本文由 二当家的白帽子 https://le-yi.blog.csdn.net/ 博客原创,转载请注明来源,谢谢~
以上是关于6. Z 字形变换(leetcode力扣算法 - java / rust)的主要内容,如果未能解决你的问题,请参考以下文章