PIO13 多组_带空格的字符串_T组形式¶
入门通过率 62.96%python3样例通过牛客 AC
一句话
每组给一个含空格的串,去掉空格后倒置输出。
解题思路¶
这题考什么¶
输入形态:T 组形式,数据本体是含空格的字符串。 这一题的全部价值就在这个「含空格」上:它把前面几题的 token 读法直接废掉了。
sys.stdin.buffer.read().split() 按空白切分, 含空格的串会被切成好几段,而段数取决于串里有几个空格—— 这是数据决定的、事先不可知的数字,游标根本无法定位下一组从哪开始。 所以必须回到按行读:行边界才是这类数据唯一可靠的分隔依据。
按行读用 sys.stdin.readline() 而不是 input(): 两者都读一行,但 readline() 不走 input() 的提示符逻辑, 在上万行的量级上快一个档次(对比见 20-输入输出处理)。 代价是 readline() 保留行尾换行符,需要自己去掉。
inp = sys.stdin 只是给它取个短名字, 循环里每次 inp.readline() 就少一次模块属性查找。
处理顺序¶
先 replace(" ", "") 删掉全部空格,再 [::-1] 倒置。 先删后转和先转后删结果相同,但先删空格能让待翻转的串更短,少扫一遍。
为什么输出用一次 write¶
t 最大 1e5,逐行 print 就是十万次输出调用;攒进 out 后 join 成一整块写出只有一次。
数据规模与复杂度¶
t <= 1e5,sum(n) <= 1e5,串仅含小写英文字母和空格,且保证首尾都不是空格。 时间 O(t + sum(n)),空间 O(t + sum(n))。
坑在哪¶
- 这一题不能用 token 读法。用了之后,含两个空格的串会被切成三段, 后续所有组的定位全部错乱,而且往往不报错,只是答案面目全非。
- readline() 保留行尾换行符,必须显式去掉。这里只剥掉换行符而不是整体 strip(), 是因为 strip() 会连同串首尾的有意义空白一起清掉; 本题保证首尾不是空格,两者结果相同,但精确写法在别处更安全。
- 每组的第一行是长度 n,含空格在内。Python 用不上它,但那一行必须读掉, 否则下一次 readline() 拿到的是数字而不是字符串。
样例复核¶
第一组 n = 9,串是 one space(含一个空格,长度 9); 删空格得 onespace,倒置得 ecapseno,与样例输出一致。
参考实现¶
[:octicons-arrow-left-16: PIO12](PIO12.md) [PIO14 :octicons-arrow-right-16:](PIO14.md)