将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:
P A H NA P L S I I GY I R
之后,你的输出需要从左往右逐行读取产生出一个新的字符串,比如:”PAHNAPLSIIGYIR”。
解题思路
这道题是一道中等题,不过挺简单的。按照题的描述走就行,首先创建一个二维数组,先竖着走,到头之后斜着向上走,到定端之后再竖着走,这样循环直到字符串结束。我们设置两个参数去改变填写字符串的位置。
const convert = function (s, numRows) {
if (numRows === 1) { return s }
const result = new Array(numRows)
for (let i = 0; i < result.length; i++) {
result[i] = new Array()
}
const sArr = s.split("")
let row = col = 0
let disRow = 1
let disCol = 0
sArr.forEach((item) => {
result[row][col] = item
row += disRow
col += disCol
if (row === numRows - 1) {
disRow = -1
disCol = 1
}
if (row === 0) {
disRow = 1
disCol = 0
}
})
return result.reduce((sum, item) => {
return sum += item.reduce((s, i) => s += i, "")
}, "")
};
Go
当我们创建一个空数组的时候,我们不可以通过索引直接赋值;我们可以通过append函数向数组中添加元素;
import "strings"
func convert(s string, numRows int) string {
if numRows == 1 {
return s
}
sArr := strings.Split(s, "")
result := make([][]string, numRows)
row, col, disR, disC := 0, 0, 1, 0
for _, item := range sArr {
result[row] = append(result[row], item)
row += disR
col += disC
if row == numRows-1 {
disR = -1
col = 1
}
if row == 0 {
disR = 1
col = 0
}
}
r := ""
for _, ss := range result {
for _, s := range ss {
r += s
}
}
return r
}
Rust
语法复习:String的拼接可以使用push和push_str两个方法一个拼接char类型另一个拼接&str;
impl Solution {
pub fn convert(s: String, num_rows: i32) -> String {
if num_rows == 1{
return s
};
let mut map = vec![];
for i in 0..num_rows {
map.push(vec![]);
};
let mut row:i32 = 0;
let mut disRow:i32 = 1;
let mut result = String::from("");
let s_arr:Vec<char> = s.chars().collect();
s_arr.iter().enumerate().for_each(|(_,cha)|{
map[row as usize].push(cha);
row+=disRow;
if row == (num_rows-1) {
disRow = -1;
};
if row == 0 {
disRow = 1;
};
});
map.iter().enumerate().for_each(|(_,item)|{
item.iter().enumerate().for_each(|(_,&i)|{
result.push(*i);
});
});
result
}
}
