E卷-文本统计分析(200分)
刷题笔记合集🔗
文本统计分析
问题描述
有一个文件,包含以特定规则编写的文本。请统计文件中包含的有效文本数量。规则如下:
- 文本以分号";"分隔,最后一条可以没有分号。空文本不计入语句数。例如,"COMMAND A; ;"只算一条语句。
- 文本可以跨行。例如,以下内容算作一条文本,而非三条:
COMMAND A AND COMMAND B;
- 文本支持字符串,可以用成对的单引号(')或双引号(")表示。字符串中可能出现转义字符(
$$
处理的引号和转义字符本身。 - 支持注释,以"-"开头,到换行结束。注释可以出现在字符串之外的任意位置。
输入格式
输入为一个文本文件的内容。
输出格式
输出一个整数,表示文件中包含的有效文本数量。
样例输入1
COMMAND TABLE IF EXISTS "UNITED STATE";
COMMAND A GREAT (
ID ADSAB,
download_length INTE-GER, -- test
file_name TEXT,
guid TEXT,
mime_type TEXT,
notifica-tionid INTEGER,
original_file_name TEXT,
pause_reason_type INTEGER,
resumable_flag INTEGER,
start_time INTEGER,
state INTEGER,
folder TEXT,
path TEXT,
total_length INTE-GER,
url TEXT
);
样例输出1
2
样例输入2
COMMAND A; -this is comment
COMMAND -comment
A AND COMMAND B;
样例输出2
2
样例解释
样例1 | 输入包含两条有效文本:第一行的 "COMMAND TABLE IF EXISTS "UNITED STATE";" 和从第二行开始的 "COMMAND A GREAT (...)" |
样例2 | 输入包含两条有效文本:第一行的 "COMMAND A;" 和第二、三行组成的 "COMMAND A AND COMMAND B;" |
数据范围
- 输入文件的总行数不超过 10000 行
- 每行的字符数不超过 1000 个字符
题解
模拟
这道题目的核心在于正确识别有效的文本语句,同时处理各种特殊情况。解题思路如下:
-
首先,需要处理字符串中的转义字符,避免它们影响后续的判断。
-
然后,处理字符串。字符串内的内容(包括分号和注释符号)都不应该影响文本计数。可以将字符串内容替换为一个简单的占位符。
-
接下来,删除所有的注释。注释从 '-' 开始到行尾结束。
-
处理完字符串和注释后,就可以开始计数了。主要是通过计算有效的分号数量来确定文本数。
-
需要特别注意处理空文本的情况。连续的分号或者分号之间只有空白字符的情况都不应该被计入有效文本。
-
最后,由于最后一条文本可以没有分号,所以需要特别检查最后是否还有未以分号结尾的有效文本。
这个解法的时间复杂度是 O(n),其中 n 是输入文本的总字符数。虽然有多次遍历和替换操作,但每次操作都是线性的。
参考代码
- Python
import re
def count_statements(text):
# 去除转义字符的影响
text = re.sub(r'\\[\'"\\\-]', '', text)
# 将字符串内容替换为简单字符
text = re.sub(r'"[^"]*"', 'a', text)
text = re.sub(r"'[^']*'", 'a', text)
# 删除注释
text = re.sub(r'-.*?(\n|$)', '', text)
# 删除空白字符
text = re.sub(r'\s', '', text)
# 处
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
算法刷题笔记 文章被收录于专栏
本专栏收集并整理了一些刷题笔记