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)的主要内容,如果未能解决你的问题,请参考以下文章

力扣6. Z 字形变换

LeetCode6.Z字形变换(图解算法)

逐步解析力扣6. Z 字形变换(使用布尔控制上下遍历)

leetcode算法:6.Z 字形变换

小Y学算法⚡️每日LeetCode打卡⚡️——6. Z 字形变换

每日算法/刷穿 LeetCode6. Z 字形变换(中等)