Pintia题解——7-8古风排版

7-8 古风排版

原题:

中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。

输入格式:

输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。

输出格式:

按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。

.

解题思路:

  1. 读取和存储输入:通过使用readline模块创建了一个接口对象rl,然后监听'line'事件,将每一行输入存储在数组buf中。这样可以获取到输入的行数和字符串。输入的第一行是行数n,第二行是待排列的字符串。
  2. 创建二维数组:通过Array.from方法创建了一个二维数组arr,大小为100x100。初始化时填充0(不是字符’0’),用于存储按照Z字形排列的字符串。
  3. 将字符串按照Z字形排列存储:通过一个循环遍历输入的字符串str,将字符逐个按顺序存储在二维数组arr中。每次存储后,更新rowrol的值,row表示当前行的索引,rol表示当前列的索引。当row等于行数n时,意味着已经达到一列的末尾,需要切换到下一列进行存储。
  4. 输出结果:通过两个嵌套的循环遍历二维数组arr,从第一行到最后一行,从最后一列到第一列,按照Z字形的顺序遍历。如果数组元素为0,则输出空格字符,否则输出该字符。通过process.stdout.write()逐个字符进行输出。

.

JavaScript(node)代码:

const readline = require("readline");
const rl = readline.createInterface({
    
    
    input: process.stdin,
});

let buf = [];

rl.on('line', (input) => {
    
    
    buf.push(input);
});

rl.on('close', () => {
    
    
    let n = parseInt(buf[0]);
    let str = buf[1];
    const arr = Array.from({
    
     length: 100 }, () => Array(100).fill(0))

    let row = 0, rol = 0
    for (let i = 0; i < str.length; i++) {
    
    
        arr[row++][rol] = str[i]
        if (row == n && i < str.length - 1) {
    
    
            rol++
            row = 0
        }
    }

    for (let i = 0; i < n; i++) {
    
    
        for (let j = rol; j >= 0; j--) {
    
    
            if (arr[i][j] === 0) {
    
    
                process.stdout.write(" ")
            } else {
    
    
                process.stdout.write(arr[i][j])
            }
        }
        console.log();
    }
});

.

复杂度分析:

时间复杂度:O(n+m)
空间复杂度:O(n+m)

猜你喜欢

转载自blog.csdn.net/Mredust/article/details/133518830
7-8