package main.java.demo6;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
/**
* 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
* <p>
* 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
* <p>
* P A H N
* A P L S I I G
* Y I R
* 之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。
* <p>
* 请你实现这个将字符串进行指定行数变换的函数:
* <p>
* string convert(string s, int numRows);
*/
public class Convert {
/**
* 算法思路:创建一个字符串列表,遍历字符串s,依次存入数组中,最后将数组整合
*
* @param s
* @param numRows
* @return
*/
public String convert_1(String s, int numRows) {
// 不要忘记如果numRows == 1时会出现越界的情况哟
if (numRows == 1) {
return s;
}
// 创建字符串链表用来存储Z字排列的字符
List<StringBuilder> rows = new ArrayList<>();
for (int i = 0; i < numRows; i++) {
rows.add(new StringBuilder());
}
char[] chars = s.toCharArray();
// 设置一个标记代表顺序执行的指针向下走还是向上走,true代表向下走,false代表向上走
Boolean flag = true;
// 创建变量current代表当前到链表的第几行
int current = 0;
for (int i = 0; i < s.length(); i++) {
rows.get(current).append(chars[i]);
if (flag) {
current++;
} else {
current--;
}
if (current == numRows - 1) {
flag = false;
} else if (current == 0) {
flag = true;
}
}
StringBuilder result = new StringBuilder();
for (StringBuilder stringBuilder : rows) {
result.append(stringBuilder);
}
return result.toString();
}
@Test
public void convertTest() {
System.out.println(convert_1("PAYPALISHIRING", 3));
}
}
字符串Z字排列
最新推荐文章于 2022-03-25 18:34:06 发布