【刷题记录】6. Z 字形变换

简介: 【刷题记录】6. Z 字形变换

一、题目描述


来源:力扣(LeetCode)


将一个给定字符串 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


二、思路分析


  • 0.0 Z形变换应该叫 И 形变换
  • 从题目来看 原字符串是 Z 形的排列顺序
  • 输出结果 其实就是 从第一行(S1)到第n行(Sn)的n个子串拼接.
  • 我们只要按定义N个子串 按顺序遍历Z形字符串 把每个字符放入到对应行的子串记录中即可
  • 行是从1-numRows 然后 numRows-1,即是该字符属于第几行子串的规律


如上面的例子2


解释:

P     I    N  ---s1 = pin

A   L S  I G  ---s2 = alsin

Y A   H R     ---s3 = yanr

P     I       ---s4 = pi


三、代码实现


class Solution {
    public String convert(String s, int numRows) {
if(numRows < 2) return s;
        List<StringBuilder> rows = new ArrayList<StringBuilder>(); //子串集合
        StringBuilder res = new StringBuilder();
for(int i =0; i < numRows; i++) rows.add(new StringBuilder());
        int i =0;   //正向的时候的该字符所在行数
        int m =-1;  //用于行数变化 正向+1 反向-1
for(char c : s.toCharArray()) {
            rows.get(i).append(c);
if(i ==0 || i == numRows -1){
                m =- m;
            }
            i += m;
        }
for(StringBuilder row : rows) res.append(row);
        return res.toString();
    }
}

复杂度分析:


  • 时间复杂度:
    网络异常,图片无法展示
    |
    遍历一遍字符串 s
  • 空间复杂度:
    网络异常,图片无法展示
    |
    N为字符串长度


运行结果


网络异常,图片无法展示
|


总结


这种模拟题最主要的还是要多找出来规律,找出相应的规律,然后转化为数学问题,就比较容易解决了。

目录
相关文章
|
7月前
|
算法
LeetCode算法题---最长回文子串、N 字形变换(四)
LeetCode算法题---最长回文子串、N 字形变换(四)
43 0
|
存储
LeetCode6-Z字形变换
LeetCode6-Z字形变换
|
2月前
|
算法 C++
Leetcode第六题(Z 字形变换)
这篇文章介绍了LeetCode第六题“Z字形变换”的解法,提供了C++的代码实现,其中使用了向量数组来模拟Z字形排列,并详细解释了算法的逻辑。
33 0
|
4月前
|
算法
LeetCode第6题N 字形变换
该文章介绍了 LeetCode 第 6 题 N 字形变换的解法,通过按列生成的方式,根据行数转换逻辑来构造字符串,主要注意控制行数的转换时机,从而实现 N 字形变换。
LeetCode第6题N 字形变换
|
6月前
|
算法 索引 Perl
力扣经典150题第二十二题:Z 字形变换
力扣经典150题第二十二题:Z 字形变换
45 1
|
7月前
|
索引
leetcode代码记录(Z 字形变换
leetcode代码记录(Z 字形变换
51 1
|
7月前
leetcode-6:Z 字形变换
leetcode-6:Z 字形变换
48 0
|
7月前
|
移动开发 算法 C#
Leetcode算法系列| 6. Z 字形变换
Leetcode算法系列| 6. Z 字形变换
leetcode:6.Z字形变换
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
58 0