C++ LeetCode1805字符串不同整数数目

 更新时间:2022年12月16日 14:35:34   作者:LetMeFly  
这篇文章主要为大家介绍了C++ LeetCode1805字符串不同整数数目,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

LeetCode 1805.字符串中不同整数的数目

力扣题目链接:leetcode.cn/problems/nu…

给你一个字符串 word ,该字符串由数字和小写英文字母组成。

请你用空格替换每个不是数字的字符。例如,"a123bc34d8ef34" 将会变成 " 123  34 8  34" 。注意,剩下的这些整数为(相邻彼此至少有一个空格隔开):"123""34""8""34"

返回对 word 完成替换后形成的 不同 整数的数目。

只有当两个整数的 不含前导零 的十进制表示不同, 才认为这两个整数也不同。

示例 1:

输入:word = "a123bc34d8ef34"
输出:3
解释:不同的整数有 "123"、"34" 和 "8" 。注意,"34" 只计数一次。

示例 2:

输入:word = "leet1234code234"
输出:2

示例 3:

输入:word = "a1b01c001"
输出:1
解释:"1"、"01" 和 "001" 视为同一个整数的十进制表示,因为在比较十进制值时会忽略前导零的存在。

提示:

  • 1 <= word.length <= 1000
  • word 由数字和小写英文字母组成

方法一:遍历拆分

这个问题主要包括三部分:

  • 将数字从字符串中抽取出来
  • 将数字的前导零去除
  • 数字的去重与计数

接下来逐个解决这三个问题

1. 将数字从字符串中提取出来:

我们需要一个布尔类型的变量“lastIsNum”来记录上一个字符是否为数字。初始值为false

同时,我们还需要一个字符串,用来存储整个字符串中的某个数字。string thisString

接下来遍历字符串。若字符串遍历结束或者遍历到字母字符时,将lastIsNum标记为true,否则将lastIsNum标记为false

如果这个字符是字母,但上一个字符是数字,那么就说明我们找到了“一个数字的末尾”,此时我们就提取出了这个数字。

处理完这个数字记得将字符串清空。

如果这个字符是数字,那么直接无脑添加数字字符串thisString的末尾即可。

2. 将数字的前导零去除:

使用一个整数类型的变量firstLoc来记录一个数字第一个非零的位置,初始值为-1

接着遍历数字字符串,遇到第一个非零数字就结束遍历,并将firstLoc修改为遍历到的位置。

如果最后firstLoc的值仍未-1,那么就说明整个数字字符串全是0

否则,从firstLoc开始到字符串末尾所组成的子串即为去除前导零后的数字字符串

3. 数字的去重与统计:

题目问的是“有多少不同的数字”,这就需要我们对所有的数字做去重处理。

这个过程很简单,直接使用一个哈希表即可

将所有的处理过的数字字符串放入哈希表,最后返回哈希表的大小即为去重后的结果。

  • 时间复杂度O(len(word))
  • 空间复杂度O(len(word))

AC代码

C++

class Solution {
private:
    unordered_set<string> se;

    void insert(string toInsert) {
        int firstLoc = -1;
        for (int i = 0; i < toInsert.size(); i++) {
            if (toInsert[i] != '0') {
                firstLoc = i;
                break;
            }
        }
        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();
        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();
    }
};

以上就是C++ LeetCode1805字符串不同整数数目的详细内容,更多关于C++ 字符串不同整数数目的资料请关注脚本之家其它相关文章!

相关文章

  • C/C++中常用加密与解密算法的实现

    C/C++中常用加密与解密算法的实现

    这篇文章主要为大家详细介绍了一些在C++中常用的加密与解密算法,这其中包括Xor异或、BASE64、AES、MD5、SHA256、RSA等,感兴趣的小伙伴可以学习一下
    2023-11-11
  • C语言中的函数指针基础学习教程

    C语言中的函数指针基础学习教程

    这篇文章主要介绍了C语言中的函数指针基础学习教程,包括函数指针作为参数来传递等重要知识,需要的朋友可以参考下
    2016-04-04
  • vs2019中使用MFC构建简单windows窗口程序

    vs2019中使用MFC构建简单windows窗口程序

    今天发现网上好多MFC代码都不能用,给大家分享一个简单的MFC窗口语言,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-06-06
  • C++获得其他程序窗体控件中信息的方法

    C++获得其他程序窗体控件中信息的方法

    这篇文章主要介绍了C++获得其他程序窗体控件中信息的方法,涉及windows控件句柄的获取技巧,需要的朋友可以参考下
    2015-05-05
  • QT已有项目导入工程时注意事项图文详解

    QT已有项目导入工程时注意事项图文详解

    QT开发这几年大大小小项目做了不少,花了点时间对知识点总结整合了一部分,下面这篇文章主要给大家介绍了关于QT已有项目导入工程时注意事项的相关资料,需要的朋友可以参考下
    2023-11-11
  • C++ 构造双向链表的实现代码

    C++ 构造双向链表的实现代码

    本篇文章是对C++中构造双向链表的实现代码进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 基于C语言实现推箱子游戏

    基于C语言实现推箱子游戏

    这篇文章主要为大家详细介绍了基于C语言实现推箱子游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • VC实现屏幕截词功能的方法详解

    VC实现屏幕截词功能的方法详解

    这篇文章主要介绍了VC实现屏幕截词功能的方法详解,对于深入的理解windows程序运行原理很有帮助,需要的朋友可以参考下
    2014-07-07
  • 简单谈谈关于C++中大随机数的问题

    简单谈谈关于C++中大随机数的问题

    这篇文章主要介绍了关于C++中大随机数的问题,文中给出了详细的示例代码,相信对大家的学习或者工作具有一定的参考借鉴价值,有需要的朋友可以一起来学习学习。
    2017-01-01
  • 浅谈do {...} while (0) 在宏定义中的作用

    浅谈do {...} while (0) 在宏定义中的作用

    下面小编就为大家带来一篇浅谈do {...} while (0) 在宏定义中的作用。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12

最新评论