1 条题解

  • 0
    @ 2025-5-27 20:57:57

    HTML浏览器文本渲染问题题解

    一、题目分析

    需要实现简化的HTML浏览器,处理规则如下:

    • 识别标签<br>(换行)和<hr>(水平横线);
    • 将空格、制表符、换行符视为单个空格;
    • 每行不超过80字符,单词不拆分,标签按特定规则渲染。

    二、算法思路

    1. 输入解析:按单词/标签分割输入,忽略空白字符;
    2. 标签处理
      • <br>直接换行;
      • <hr>输出80个-并换行;
    3. 单词布局:根据当前行长度决定是否换行,确保单词完整显示。

    三、代码实现(原代码框架)

    #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;
    }
    

    四、代码核心逻辑解析

    1. 输入处理流程
      • 逐字符读取,跳过空白符(ASCII≤32),读取连续非空白字符形成token(单词/标签)。
    2. 标签渲染逻辑
      • <br>:输出换行,重置行长度i=0
      • <hr>:若当前行非空则先换行,输出80个-后换行,重置i=0
    3. 单词布局逻辑
      • 行首单词直接添加,更新i为单词长度;
      • 非行首时,若i+1+单词长度≤80,添加空格和单词(i增加1+长度),否则换行后添加单词。
    4. 边界处理
      • 最后强制输出换行符,确保输出格式正确。

    五、示例输入输出对应关系

    输入片段Zwei <br> <br> produzieren zwei Newlines.

    1. 读取Zwei:行首,输出Zweii=4
    2. 读取<br>:输出换行,i=0
    3. 读取<br>:输出换行,i=0
    4. 读取produzieren:行首,输出produziereni=10
    5. 后续单词按规则添加,最终渲染为:
      Zwei
      
      produzieren zwei Newlines.
      

    六、复杂度分析

    • 时间复杂度:O(n),n为输入字符数,每个字符仅处理一次;
    • 空间复杂度:O(1),仅存储当前单词/标签,不随输入规模增长。

    七、关键技巧

    1. 字符级输入处理:通过cin.get(c)逐字符读取,精准分割单词与标签;
    2. 行长度动态跟踪:用i记录当前行长度,确保单词不跨行拆分;
    3. 标签优先级处理<hr><br>的渲染优先级高于单词布局规则。
    • 1

    信息

    ID
    1272
    时间
    2000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    4
    已通过
    1
    上传者