1 条题解
-
0
HTML浏览器文本渲染问题题解
一、题目分析
需要实现简化的HTML浏览器,处理规则如下:
- 识别标签
<br>(换行)和<hr>(水平横线); - 将空格、制表符、换行符视为单个空格;
- 每行不超过80字符,单词不拆分,标签按特定规则渲染。
二、算法思路
- 输入解析:按单词/标签分割输入,忽略空白字符;
- 标签处理:
<br>直接换行;<hr>输出80个-并换行;
- 单词布局:根据当前行长度决定是否换行,确保单词完整显示。
三、代码实现(原代码框架)
#include <iostream> #include <string> using namespace std; // 定义cin函数,处理输入并渲染文本 void cinFunction() { string s = ""; char c; int i = 0; // 当前行已占用的字符数 while (cin.get(c)) { // 跳过空白字符(ASCII≤32) while ((int)c <= 32 && cin.get(c)); if ((int)c <= 32) break; // 读取单词/标签 do { s += c; } while (cin.get(c) && (int)c > 32); int len = s.length(); if (s == "<br>") { // 换行标签 cout << endl; i = 0; } else if (s == "<hr>") { // 水平横线标签 if (i > 0) cout << endl; for (int j = 1; j <= 80; ++j) cout << "-"; cout << endl; i = 0; } else { // 普通单词 if (i == 0) { if (len < 80) { cout << s; i = len; } } else { if (i + 1 + len <= 80) { cout << " " << s; i = i + 1 + len; } else { cout << endl; cout << s; i = len; } } } s = ""; } cout << endl; } int main() { cinFunction(); return 0; }四、代码核心逻辑解析
- 输入处理流程:
- 逐字符读取,跳过空白符(ASCII≤32),读取连续非空白字符形成
token(单词/标签)。
- 逐字符读取,跳过空白符(ASCII≤32),读取连续非空白字符形成
- 标签渲染逻辑:
<br>:输出换行,重置行长度i=0;<hr>:若当前行非空则先换行,输出80个-后换行,重置i=0。
- 单词布局逻辑:
- 行首单词直接添加,更新
i为单词长度; - 非行首时,若
i+1+单词长度≤80,添加空格和单词(i增加1+长度),否则换行后添加单词。
- 行首单词直接添加,更新
- 边界处理:
- 最后强制输出换行符,确保输出格式正确。
五、示例输入输出对应关系
输入片段:
Zwei <br> <br> produzieren zwei Newlines.- 读取
Zwei:行首,输出Zwei,i=4; - 读取
<br>:输出换行,i=0; - 读取
<br>:输出换行,i=0; - 读取
produzieren:行首,输出produzieren,i=10; - 后续单词按规则添加,最终渲染为:
Zwei produzieren zwei Newlines.
六、复杂度分析
- 时间复杂度:O(n),n为输入字符数,每个字符仅处理一次;
- 空间复杂度:O(1),仅存储当前单词/标签,不随输入规模增长。
七、关键技巧
- 字符级输入处理:通过
cin.get(c)逐字符读取,精准分割单词与标签; - 行长度动态跟踪:用
i记录当前行长度,确保单词不跨行拆分; - 标签优先级处理:
<hr>和<br>的渲染优先级高于单词布局规则。
- 识别标签
- 1
信息
- ID
- 1272
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 1
- 上传者