Z字形变换-力扣-LeetCode

描述

将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
在这里插入图片描述
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:“LCIRETOESIIGEDHN”。
请你实现这个将字符串进行指定行数变换的函数

示例 1:
输入: s = “LEETCODEISHIRING”, numRows = 3
输出: “LCIRETOESIIGEDHN”
示例 2:
输入: s = “LEETCODEISHIRING”, numRows = 4 输出: “LDREOEIIECIHNTSG”
解释:
Z字形变换-力扣-LeetCode_第1张图片

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/zigzag-conversion
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

以示例二为例,就是把Z字形的各个字符在原字符串中的位置写上,然后找规律就是了
1、numRow - 2 就是斜着的字符的个数
2、span = numRow + (numRow - 2) 就是竖直字符的跨度
3、span - (i - 2) 就是斜着的与上一个竖直的之间的跨度
Z字形变换-力扣-LeetCode_第2张图片

public static String convert(String s, int numRows) {
     
        int span1 = numRows + (numRows - 2);
        if (span1 == 0) {
     
            return s;
        }
        StringBuilder str = new StringBuilder();
        for (int i = 1; i <= numRows; i++) {
     
            if (i == 1 || i == numRows) {
     
                int temp = i-1;
                while (temp < s.length()) {
     
                    str.append(s.charAt(temp));
                    temp += span1;
                }
            } else {
     
                int span2 = span1 - (i - 2);
                int temp1 = i - 1;
                int temp2 = span2 - 1;
                while (temp1 < s.length()) {
     
                    str.append(s.charAt(temp1));
                    if (temp2 < s.length()) {
     
                        str.append(s.charAt(temp2));
                    }
                    temp2 += span1;
                    temp1 += span1;
                }
            }
            //System.out.println(str);
        }
        return String.valueOf(str);
    }

你可能感兴趣的:(leetcode,java)