LeetCode 1805. 字符串中不同整数的数目(c++)

117 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情

前言

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

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

给你一个字符串 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 由数字和小写英文字母组成

二、思路分析

首先用哈希表记录每个数字。我想到的是用两个指针,但思路比较混乱,始终没有理清。最后看了一些解答才理清了思路。也了解到了isdigit()这个函数,能够判断一个字符是否是数字字符,这无疑对于本题的解答提供了很大的方便。

其次,当遇到了数字字符数时,首先判断该字符是否是数字0的字符形式,如果是的话,则左指针就不能定位于此,直到遇到的第一个数字字符不是0的时候,左指针才能够定位,紧接着就开始定位右指针。

最后将左右指针中间的字符复制到空字符串并添加到哈希表中,以此遍历。

三、AC代码

class Solution {
public:
    int numDifferentIntegers(string word) {
        unordered_set<string> s;
        int len = word.size();
        for (int i = 0; i < len; ++i) {
            if (isdigit(word[i])) {
                while (i < len && word[i] == '0') ++i;
                int j = i;
                while (j < n && isdigit(word[j])) ++j;
                s.insert(word.substr(i, j - i));
                i = j;
            }
        }
        return s.size();
    }
};

提交排名

image.png

四、总结

这题比较简单,但一时半会仍没想到思路,需要继续加强训练。