用双引号把全文切成 n+1 段,再与无限交替的左、右 TeX 引号对拼接:第奇数个双引号换左引号、第偶数个换右引号。
OJ: roj
题目 ID: 20006
难度:入门
标签:入门字符串模拟python
创建: 2026-10-02 19:28
更新: 2026-10-06 02:18
题目描述
输入一篇包含 ASCII 双引号 " 的文章,把它转换成 TeX 格式:第奇数个 " 换成左双引号 ``,第偶数个 " 换成右双引号 '',其余字符原样输出。输入可能有多个行。
思路
全文顺序扫描,遇到 " 就按当前奇偶状态输出左/右引号并翻转状态,其它字符直接输出。单引号、反引号都不参与替换。
参考代码
Python 版:
python
#!/usr/bin/env python3
# Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
# rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
# rainboy的学习导航网站: https://idx.roj.ac.cn
# create_at: 2026-10-02 19:29
# update_at: 2026-10-02 19:29
import sys
from itertools import cycle
QUOTES = ("``", "''") # 第 1、3、5… 个双引号用左引号,第 2、4、6… 个用右引号
def solve() -> None:
"""把文章中交替出现的双引号改写成 TeX 的左、右双引号。"""
text = sys.stdin.buffer.read().decode()
head, *parts = text.split('"') # n 个双引号把文章切成 n+1 段
# 第 i 个双引号位于第 i 段与第 i+1 段之间;cycle 让引号奇偶交替
sys.stdout.write(head + ''.join(q + part for q, part in zip(cycle(QUOTES), parts)))
if __name__ == "__main__":
solve()C++ 版(同一算法):
cpp
/**
* Author by Rainboy blog: https://rainboylv.com github: https://github.com/rainboylvx
* rbook: -> https://rbook.roj.ac.cn https://rbook2.roj.ac.cn
* rainboy的学习导航网站: https://idx.roj.ac.cn
* create_at: 2026-10-06 02:18
* update_at: 2026-10-06 02:18
*/
#include <iostream>
#include <cstdio>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
char ch;
bool is_open = true; // 下一个双引号是开引号(左)还是闭引号(右)
while (cin.get(ch)) {
if (ch == '"') {
// 第奇数个双引号输出左引号,第偶数个输出右引号
if (is_open) cout << "``";
else cout << "''";
is_open = !is_open; // 翻转奇偶状态
} else {
cout << ch;
}
}
return 0;
}