Z字形变换-力扣-LeetCode

mac2025-08-13  3

描述

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

示例 1: 输入: s = “LEETCODEISHIRING”, numRows = 3 输出: “LCIRETOESIIGEDHN” 示例 2: 输入: s = “LEETCODEISHIRING”, numRows = 4 输出: “LDREOEIIECIHNTSG” 解释:

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

思路

以示例二为例,就是把Z字形的各个字符在原字符串中的位置写上,然后找规律就是了 1、numRow - 2 就是斜着的字符的个数 2、span = numRow + (numRow - 2) 就是竖直字符的跨度 3、span - (i - 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); }
最新回复(0)