0
点赞
收藏
分享

微信扫一扫

java实现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

class Solution {
    public String convert(String s, int numRows) {
        if(numRows == 1)return s;
        int len = s.length();
        int flag[] = new int[len];//给每个元素打标记,记录在哪行
        flag[0] = 1;
        int direction = 1;//控制标记的变化方向
        for(int i = 1; i < len; i++){
            if(flag[i - 1] == 1)direction = 1;
            else if(flag[i - 1] == numRows)direction = -1;
            flag[i] = flag[i - 1] + direction;
        }
        int j = 1, n = 0;
        char[] arr = new char[len]; 
        while(j <= numRows){
            for(int i = 0; i < len; i++){
                if(flag[i] == j){
                    arr[n++] = s.charAt(i);
                }
            }
            j++;
        }
        return new String(arr);
    }
}

  1. 如果numRows为1,直接返回原始字符串s,因为不需要进行“Z”字形变换。
  2. 获取字符串s的长度,并创建一个整型数组flag,用于记录字符串中每个字符在“Z”字形变换后的行号。
  3. 初始化flag数组的第一个元素为1,表示字符串的第一个字符位于第一行。
  4. 使用变量direction来控制行号的增加或减少,以实现“Z”字形的上下移动。
  5. 遍历字符串s,根据前一个字符的行号来更新当前字符的行号,并改变方向(当行号为1时向上移动,当行号为numRows时向下移动)。
  6. 创建一个字符数组arr,用于存储变换后的字符顺序。
  7. 遍历每一行,根据flag数组中的行号信息,将字符从原始字符串s中取出,并按行顺序放入arr数组中。
  8. 最后,将字符数组arr转换为字符串并返回。





举报

相关推荐

0 条评论