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
- 上传者