C++ 实现 LeetCode 1805. 字符串中不同整数的数目

Ivy
Ivy
发布时间:2026-10-15| 5人浏览过
原创

本文讲解 LeetCode 1805 题「字符串中不同整数的数目」的 C++ 解决方案。通过将字母替换为空格分隔数字,去除前导零后进行去重统计,最终利用哈希表高效得出结果。

题目解析与解题思路

力扣题目链接:leetcode.cn/problems/number-of-different-integers-in-a-string(注:原链接截断,此处以题目描述为准)

本题要求从由数字和小写英文字母组成的字符串 word 中提取所有整数,并统计其中不同整数的数量。关键判断标准是:仅当两个整数的十进制表示(不含前导零)不同时,才视为不同的整数。

示例说明:

  • 示例 1:输入 "a123bc34d8ef34",提取出 "123", "34", "8", "34"。去重后为 "123", "34", "8",结果为 3。
  • 示例 3:输入 "a1b01c001",提取出的 "1", "01", "001" 在去除前导零后均变为 "1",因此视为同一个整数,结果为 1。

解决步骤:

  1. 提取数字:将非数字字符视为分隔符,分离出连续的纯数字子串。
  2. 规范化处理:去除每个数字串的前导零。若全为零,则保留一个 "0"。
  3. 去重计数:将规范化后的数字存入无序集合(Hash Set),利用其特性自动去重,最后返回集合大小。

具体实现方法

第1步:遍历字符串并识别数字边界

目的:准确捕获连续的整数片段。

操作:定义布尔变量 lastIsNum 标记上一个字符是否为数字。遍历字符串时,若当前字符是字母或到达字符串末尾,且 lastIsNum 为真,说明此前是一个完整数字串的结尾,触发提取逻辑。反之,若当前字符是数字,则将其追加到临时缓冲区。

第2步:去除前导零

目的:统一数值表示,消除格式差异带来的干扰。

操作:对于提取出的数字字符串,查找第一个非 '0' 字符的位置 firstLoc。如果 firstLoc 仍为初始值 -1,说明整个串全是 0,插入 "0";否则,截取从 firstLoc 到末尾的子串作为规范形式。

第3步:存储至哈希表去重

目的:快速完成统计。

操作:使用 C++ std::unordered_set<string> 容器。每得到一个规范化后的数字串,调用 insert 方法。由于 set 的唯一性,重复的数字会被忽略。最终返回 set.size()。

C++ 参考代码

class Solution {
private:
    unordered_set se;

    void insert(string toInsert) {
        int firstLoc = -1;
        for (int i = 0; i < toInsert.size(); i++) {
            if (toInsert[i] != '0') {
                firstLoc = i;
                break;
            }
        }
        // 如果全是0,则记录为 "0"
        if (firstLoc == -1)
            se.insert("0");
        else
            // 否则跳过前导零
            se.insert(toInsert.substr(firstLoc));
    }
public:
    int numDifferentIntegers(string word) {
        bool lastIsNum = false;
        string thisString;
        int n = word.size();
        // 遍历至 n,方便处理末尾为数字的情况
        for (int i = 0; i <= n; i++) {
            // 如果是字母或者到达了字符串末尾
            if (i == n || isalpha(word[i])) {
                // 如果之前是在记录数字,说明一个数字结束
                if (lastIsNum) {
                    lastIsNum = false;
                    insert(thisString); // 存入并处理前导零
                    thisString.clear(); // 清空临时串
                }
            } else {
                // 是数字,继续拼接
                thisString += word[i];
                lastIsNum = true;
            }
        }
        return se.size();
    }
};

复杂度分析

  • 时间复杂度: O(len(word))。只需单次线性遍历,字符串截取和哈希插入的平均时间复杂度为 O(1) 或受限于数字长度,总体保持线性。
  • 空间复杂度: O(len(word))。最坏情况下,数字串可能占据一半以上的存储空间用于临时缓存和哈希集合存储。

总结

该题主要考察字符串的遍历技巧以及对前导零的逻辑处理。利用 unordered_set 可以极大地简化去重逻辑。以上就是 C++ 实现 LeetCode 1805 字符串不同整数数目的详细内容,更多关于 C++ 字符串处理算法的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。