一、原题
将一个给定字符串 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);
示例 1:
输入:s = "PAYPALISHIRING", numRows = 3 输出:"PAHNAPLSIIGYIR"
示例 2:
输入:s = "PAYPALISHIRING", numRows = 4 输出:"PINALSIGYAHRPI" 解释: P I N A L S I G Y A H R P I
示例 3:
输入:s = "A", numRows = 1 输出:"A"
二、心得
这道题提示非常清晰,我直接用二维矩阵(写完上一篇后学的,o(* ̄▽ ̄*)ブ),首先肯定是要得出二维矩阵的行列长度,如下图所示:
然后就是将每个字母放入矩阵对应的位置,最后再横向读取数据。直接看结果:
class Solution {
public String convert(String s, int numRows) {
if(numRows == 1 || numRows >= s.length()){
return s;
}
// 初始化一个二维矩阵,计算其行列长度
int row = numRows; // 行
int column = (numRows - 1) * (s.length() / (2 * numRows - 2) + 1); // 列
char[][] c = new char[row][column];
for(int i = 0, x = 0, y = 0; i < s.length(); i ++){
c[x][y] = s.charAt(i);
if(i % (2 * numRows - 2) < (numRows - 1)){
x ++; // 向下存入
}else{
x --;
y ++; // 向右上移动
}
}
StringBuffer a = new StringBuffer();
for(char[] ro : c){
for(char co : ro){
if(co != 0){
a.append(co);
}
}
}
return a.toString();
}
}
至于如何存入字母到二维矩阵,结合下面的表格可以快速的定位位置,但要注意,矩阵的初始位置是从0开始的哦~(*^_^*)
i从0开始取 | |||||||
numRows = 3 | 0 | 4 | 8 | 12 | |||
1 | 3 | 5 | 7 | 9 | 11 | 13 | |
2 | 6 | 10 | |||||
numRows = 3 | P | A | H | N | |||
A | P | L | S | I | I | G | |
Y | I | R |
最后用到了 StringBuffer a = new StringBuffer(); (我学来的),定义了一个字符缓冲区,然后两次遍历得到非空的字母,并 append() 进 StringBuffer 中,最后不要忘记转为 String 类型的字符串。
小白也在很努力地学习呢!O(∩_∩)O~