Python入门习题(57)——团体程序设计天梯赛习题:古风排版

题目描述

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

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

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

输入样例:
4
This is a test case

输出样例:

asa T
st ih
e tsi
 ce s

解题思路

数据结构
  1. 用变量row_num存储输入正整数N。
  2. 用line存储输入的一行字符串。在其尾部凑上若干空格字符,使得line的长度恰好是row_num的整数倍。
算法
  1. 输入一行字符串line。如果字符串的长度不是row_num的整数倍,那么在尾部补上(row_num - len(line) % row_num)个空格,使得line的长度恰好是row_num的整数倍。
  2. 对于第 i 行(i = 0, 1, …, row_num - 1):
    (1)抽取line内第i, i+row_num, i + 2row_num, i + 3row_num, …个字符,组成字符串row。
    (2)逆序输出字符串row。
细节
  1. N是正整数。
  2. 输入的第二行给出一个长度不超过1000的非空字符串,以回车结束。
  3. 如果用C/C++语言答题,用字符数组存储输入的字符串,类似上面的算法那样在尾部补上(row_num - len(line) % row_num)个空格的话,字符数组的最小长度应该为1000 + 100,而不是1000 + 1。

参考答案

row_num = int(input())
line = input()
if len(line) % row_num > 0:
    line += ' ' * (row_num - len(line) % row_num)  #尾部补上空格

for i in range(row_num):
    row = line[i::row_num]  #切片操作,抽取line内第i, i+row_num, i + 2*row_num, ...个字符,组成字符串row
    print(row[::-1])  #切片操作,得到逆序的字符串

测试用例

  1. 题目描述给出的测试用例覆盖了字符串长度不是N的整数倍的情形。

  2. N取其他值,字符串长度不是N的整数倍的情形。尽管这一测试用例与题目描述给出的测试用例覆盖了一样的情形,但是有用的——证明程序不是碰巧蒙对了。
    样例输入
    7
    12345671234567123456712345
    样例输出
    1111
    2222
    3333
    4444
    5555
    666
    777

  3. N=1的边界值情形。
    样例输入
    1
    123456789
    样例输出
    987654321

  4. 字符串的长度是N的整数倍的情形。
    样例输入
    2
    1234567890
    样例输出
    97531
    08642

小结

  1. 本题在PTA网站上,通过率是22%,因此在此发文讲解。
  2. 借助Python语言强大的字符串处理能力,上面给出的参考答案只有数行。
  3. Python语言的切片操作可以作用在字符串、列表上,用处多多,值得好好学习和运用。
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值