将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下:

  1. P A H N
  2. A P L S I I G
  3. Y 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
    }
}