L1-039_古风排版博客(20 分)[java][python]
·
题目来源:PTA 团体程序设计天梯赛
题目编号:L1-039
作者:陈越
出题单位:浙江大学
分值:20 分
📋 题目描述
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
📥 输入格式
输入在第一行给出一个正整数 N(< 100),是每一列的字符数。第二行给出一个长度不超过 1000 的非空字符串,以回车结束。
📤 输出格式
按古风格式排版给定的字符串,每列 N 个字符(除了最后一列可能不足 N 个)。
📌 输入样例
4
This is a test case
📌 输出样例
asa T
st ih
e tsi
ce s
💡 解题思路
核心问题: 把一个字符串按照"从右向左、从上到下"的古风方式排成若干列,然后按行输出。
分析步骤:
- 理解排版规则:古风排版是"竖向从上到下,整体从右向左"。也就是说,原字符串先按每列 N 个字符分组,然后第一列放最右边,最后一列放最左边。
- 确定列数:总字符数为
len,每列字符数为 N,则总列数cols = ceil(len / N)。 - 构建二维结构:把字符串按列填入一个二维数组(或模拟),第 j 列存放字符串中第
j*N到j*N+N-1的字符。 - 按行输出(从右向左):对于第
i行(i 从 0 到 N-1),依次从第cols-1列到第0列输出对应的字符。若某列不足 N 个字符,该位置用空格补齐。 - 注意行末不加多余空格:每行相邻字符之间无分隔符,直接拼接输出。
关键点: 最后一列可能不满 N 个字符,需用空格补全,以保证按行输出时对齐。
💻 代码实现(Java)
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt(); // 每列字符数
sc.nextLine(); // 消耗换行
String s = sc.nextLine(); // 输入字符串
int len = s.length();
// 计算总列数(向上取整)
int cols = (len + n - 1) / n;
// 构建二维字符数组,不足部分用空格补全
char[][] grid = new char[n][cols];
for (int j = 0; j < cols; j++) {
for (int i = 0; i < n; i++) {
int idx = j * n + i;
if (idx < len) {
grid[i][j] = s.charAt(idx);
} else {
grid[i][j] = ' '; // 不足部分补空格
}
}
}
// 按行输出,列从右向左
for (int i = 0; i < n; i++) {
StringBuilder sb = new StringBuilder();
for (int j = cols - 1; j >= 0; j--) {
sb.append(grid[i][j]);
}
System.out.println(sb.toString());
}
}
}
🐍 代码实现(Python)
n = int(input())
s = input()
length = len(s)
cols = (length + n - 1) // n # 总列数
# 构建二维结构,不足补空格
grid = []
for j in range(cols):
col = []
for i in range(n):
idx = j * n + i
if idx < length:
col.append(s[idx])
else:
col.append(' ')
grid.append(col)
# 按行输出,列从右向左
for i in range(n):
line = ''
for j in range(cols - 1, -1, -1):
line += grid[j][i]
print(line)
✅ 运行验证
输入:
4
This is a test case
手动模拟:
字符串 This is a test case(共19个字符),每列4个字符:
| 列号 | 字符(从上到下) |
|---|---|
| 列0(最右) | T, h, i, s |
| 列1 | ’ ', i, s, ’ ’ |
| 列2 | a, ’ ', t, e |
| 列3 | s, t, ’ ', c |
| 列4(最左) | a, s, e, (空格补全) |
按行从右列→左列输出(共4行):
- 第0行:a + s + a + ’ ’ + T =
asa T - 第1行:s + t + ’ ’ + i + h =
st ih - 第2行:e + ’ ’ + t + s + i =
e tsi - 第3行:(空格) + c + e + ’ ’ + s =
ce s
输出:
asa T
st ih
e tsi
ce s
✅ 与预期结果完全一致!
📊 复杂度分析
| 项目 | 值 |
|---|---|
| 时间复杂度 | O(N × cols) = O(字符串长度) |
| 空间复杂度 | O(N × cols) = O(字符串长度) |
| 字符串最大长度 | 1000 |
| N 最大值 | < 100 |
完全在题目限制范围内,无需担心超时或超内存。
📝 总结
本题的关键是正确理解"古风排版"的规则:
- 填充方向:从左到右按列填入字符串(每列从上到下)
- 输出方向:从最右列到最左列,按行打印
- 补全处理:最后一列不足 N 个字符时,用空格补满,保证对齐
掌握了这个思路,代码实现并不复杂,注意边界处理即可。
更多推荐




所有评论(0)