跳转至

PIO10 单组_字符串

入门通过率 71.74%python3样例通过牛客 AC

牛客原题  源码

讲解章节字符串输入输出处理

一句话

读入一个长度为 n 的小写字母串,倒置后输出。

解题思路

这题考什么

输入形态:单组数据,带前导数量,数据本体是一行字符串。 与 PIO6 的结构一样,n 只是告诉你串有多长,Python 里用不上—— 但那一行仍然必须读掉,否则第二次 input() 拿到的是 n 而不是字符串。

倒置用切片 s[::-1]。步长为 -1 的切片由解释器在 C 层一次性完成, 时间 O(n),只分配一个新字符串。

与其他写法相比: "".join(reversed(s)) 结果相同,但要先建一个反向迭代器再逐字符拼,常数更大; 用 for 循环写 r = c + r 则是 O(n^2)——字符串不可变, 每次拼接都要把已有内容整体复制一遍,n = 1e5 时这一步就要复制约 5e9 个字符。

为什么用 strip()

input() 已经去掉了行尾的换行符,但没有去掉可能存在的回车符。 数据文件若是 Windows 行尾(回车 + 换行,即 CRLF), 残留的回车会被当成串的最后一个字符,倒置后跑到输出的最前面, 表现为「看起来一模一样却判错」或者输出串莫名其妙地换了行。 strip() 一次性把首尾空白清干净,是这类题的常规防御写法。

数据规模与复杂度

n <= 1e5,串仅含小写英文字母。时间 O(n),空间 O(n)。 只有两行输入、一行输出,input() 与 print 的调用次数是常数,不构成瓶颈。

坑在哪

  1. 漏读第一行会把 n 本身当成待倒置的字符串。
  2. 不 strip() 时,行尾残留字符会跑到倒置结果的开头。
  3. 不要写成 print(input()[::-1].strip())——先倒置再 strip, 残留字符已经被搬到串首,strip() 虽然也能去掉,但一旦串首本该有空白就会被误删。 先清洗再变换是更稳的顺序。

参考实现

solutions/PIO10.py
input()                                   # 读掉 n 那一行;长度信息 Python 用不上,但行必须消费
print(input().strip()[::-1])              # 先 strip 清掉行尾残留,再用步长 -1 的切片倒置
[:octicons-arrow-left-16: PIO9](PIO9.md) [PIO11 :octicons-arrow-right-16:](PIO11.md)