题目来源: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)
importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);intn=sc.nextInt();// 每列字符数sc.nextLine();// 消耗换行Strings=sc.nextLine();// 输入字符串intlen=s.length();// 计算总列数(向上取整)intcols=(len+n-1)/n;// 构建二维字符数组,不足部分用空格补全char[][]grid=newchar[n][cols];for(intj=0;j<cols;j++){for(inti=0;i<n;i++){intidx=j*n+i;if(idx<len){grid[i][j]=s.charAt(idx);}else{grid[i][j]=' ';// 不足部分补空格}}}// 按行输出,列从右向左for(inti=0;i<n;i++){StringBuildersb=newStringBuilder();for(intj=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=[]forjinrange(cols):col=[]foriinrange(n):idx=j*n+iifidx<length:col.append(s[idx])else:col.append(' ')grid.append(col)# 按行输出,列从右向左foriinrange(n):line=''forjinrange(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 个字符时,用空格补满,保证对齐
掌握了这个思路,代码实现并不复杂,注意边界处理即可。