将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
示例 1:
s = "PAYPALISHIRING", numRows = 3 时,排列如下:
P A H N
A P L S I I G
Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。
示例 2:
输入:s = "PAYPALISHIRING", numRows = 4
排列:
P I N
A L S I G
Y A H R
P I
输出:"PINALSIGYAHRPI"
分析:
可以观察规律,每2n-2个都会重复一次
代码解法
public static void main(String[] args) {
String s = "PAYPALISHIRING";
int numRows = 3;
Map<Integer, List> temp = new HashMap<>();
int lineNum = 0;
// “|/|\|”形中一次竖折的数目
int modNum = 2*numRows-2;
boolean plusFlag=true;
for (int i = 0; i < s.length(); i++) {
// 第一个转向,需要行数递减
if (i%modNum == numRows) {
lineNum = lineNum-2;
plusFlag = false;
// 第二个转向,说明进入第二次的“|\”,需要行数归0,并递增
} else if (i%modNum == 0){
lineNum=0;
plusFlag = true;
}
if (!temp.containsKey(lineNum)) {
temp.put(lineNum, new ArrayList<>());
}
temp.get(lineNum).add(s.charAt(i));
if (plusFlag) {
lineNum++;
} else {
lineNum--;
}
}
// 合并字符串
String result = temp.values().stream()
.map( characters -> characters.stream().map(String::valueOf).collect(Collectors.joining()))
.collect(Collectors.joining());
System.out.println(result);
}
本文暂时没有评论,来添加一个吧(●'◡'●)