一. 问题描述
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。
示例 1:
输入: s = "LEETCODEISHIRING", numRows = 3
输出: "LCIRETOESIIGEDHN"
示例 2:
输入: s = "LEETCODEISHIRING", numRows = 4
输出: "LDREOEIIECIHNTSG"
解释:
L D R
E O E I I
E C I H N
T S G
二. 问题分析
2.1 看到结果是每一行去掉空格后连接起来,想到用数组存放每一行的数据(并且不需要空格)。
2.2 循环遍历每一个字符串,并判断他们是属于数组的第几个,这样追加到后面。
2.3 难点就是怎么判断它是哪一行的呢?首先我们确定一个循环单位的长度:unit = 2*numRows -2,
i对unit取余,如果余数是0,那就是第一行;余数是1,就是第二行;...;但是存在余数大于行数的情况怎么办呢?我们发现unit-余数就是i对应的行数,分析完毕。
三. 代码书写
package com.hjb.leetcode;
/**
* @DESC Z-字形变换
* @author HJB
* @date 2020年4月21日 下午9:05:29
*/
public class Z_ZiXingBianHuan {
public String convert(String s, int numRows) {
String[] arr = new String[numRows];
for (int i=0; i<numRows; i++) {
arr[i] = "";
}
int unit = numRows * 2 - 2;
if (unit == 0) {
return s;
}
for (int i=0; i<s.length(); i++) {
int index = i % unit;
if (index >= numRows) {
index = unit -index;
}
String str = arr[index] + s.charAt(i);
arr[index] = str;
}
String result = "";
for (int i=0;i<numRows;i++) {
result += arr[i];
}
return result;
}
public static void main(String[] args) {
System.out.println(new Z_ZiXingBianHuan().convert("LEETCODEISHIRING", 4));
}
}
运行结果
LDREOEIIECIHNTSG