题目
将一个给定字符串 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);
链接
https://leetcode-cn.com/problems/zigzag-conversion/
代码
/**
* 06 Z 字形变换
* 输入:s = "PAYPALISHIRING", numRows = 3
* 输出:"PAHNAPLSIIGYIR"
*/
@Test
public void test6(){
String s = "PAYPALISHIRING";
int numRows = 4;
String convert = convert(s, numRows);
System.out.println(convert);
}
public String convert(String s, int numRows) {
/*
以下为最终排列结果,数字为原字符位置对应下标
规律:以4行为例 第一行,最后一行 依次增加 2 * (numRows - 1)->6个位下标;
中间行 第一次增量 hf-2*i ->4 后续依次为 hf - mid
P0 A4 H8 N12
A1 P3 L5 S7 I9 I11 G13
Y2 I6 R10
4行排列:
P0 I6 N12
A1 L5 S7 I11 G13
Y2 A4 H8 R10
P3 I9
*/
//单列或单行
if(s.length()<=numRows||numRows==1){
return s;
}
StringBuilder sb = new StringBuilder();
//首尾增量
int hf = 2 * (numRows - 1);
for (int i = 0; i < numRows; i++) {
int index = i;
//首尾行
if(i==0||i==numRows-1){
while (index<s.length()){
sb.append(s.charAt(index));
index = index + hf;
}
}else {
//中间行增量
int mid = hf-2*i;
while (index < s.length()) {
sb.append(s.charAt(index));
index = index + mid;
mid = hf - mid;
}
}
}
return sb.toString();
}