题目描述
中国的古人写文字,是从右向左竖向排版的。本题就请你编写程序,把一段文字按古风排版。
输入格式:
输入在第一行给出一个正整数N(<100),是每一列的字符数。第二行给出一个长度不超过1000的非空字符串,以回车结束。
输出格式:
按古风格式排版给定的字符串,每列N个字符(除了最后一列可能不足N个)。
输入样例:
4
This is a test case
输出样例:
asa T
st ih
e tsi
ce s
解题思路
数据结构
- 用变量row_num存储输入正整数N。
- 用line存储输入的一行字符串。在其尾部凑上若干空格字符,使得line的长度恰好是row_num的整数倍。
算法
- 输入一行字符串line。如果字符串的长度不是row_num的整数倍,那么在尾部补上(row_num - len(line) % row_num)个空格,使得line的长度恰好是row_num的整数倍。
- 对于第 i 行(i = 0, 1, …, row_num - 1):
(1)抽取line内第i, i+row_num, i + 2row_num, i + 3row_num, …个字符,组成字符串row。
(2)逆序输出字符串row。
细节
- N是正整数。
- 输入的第二行给出一个长度不超过1000的非空字符串,以回车结束。
- 如果用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]) #切片操作,得到逆序的字符串
测试用例
-
题目描述给出的测试用例覆盖了字符串长度不是N的整数倍的情形。
-
N取其他值,字符串长度不是N的整数倍的情形。尽管这一测试用例与题目描述给出的测试用例覆盖了一样的情形,但是有用的——证明程序不是碰巧蒙对了。
样例输入
7
12345671234567123456712345
样例输出
1111
2222
3333
4444
5555
666
777 -
N=1的边界值情形。
样例输入
1
123456789
样例输出
987654321 -
字符串的长度是N的整数倍的情形。
样例输入
2
1234567890
样例输出
97531
08642
小结
- 本题在PTA网站上,通过率是22%,因此在此发文讲解。
- 借助Python语言强大的字符串处理能力,上面给出的参考答案只有数行。
- Python语言的切片操作可以作用在字符串、列表上,用处多多,值得好好学习和运用。