题目思路分析:31不同整数的计数问题 | 豆包MarsCode AI 刷题

56 阅读3分钟

引言:本题主要考察了对于字符串的处理以及对于如何正确使用stl容器有一定的帮助

题目如下: 小R有一个字符串 word,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。

例如,给定字符串 "a123bc34d8ef34",替换后形成的字符串是 " 123 34 8 34",剩下的整数是 "123""34""8" 和 "34"。不同的整数有三个,即 "123""34" 和 "8"

注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。

题目思路: 1、我们不难想到,首先需要对于字符串进行遍历便且消除其中的非数字字符,该部分我们可以通过创建一个新的字符串用来存储删除过后的数组。具体操作如下

    for (char c : word) {
        if (isdigit(c)) {
            newWord.push_back(c);
        } else {
            newWord.push_back(' ');
        }
    }

2、通过上一步,我们可以得到只包含数字的字符串,那么,之后我们该如何操作呢? (1)对于还没有学习过stl函数的同学,可以创建一个字符串数组用于存储各个数字,每次遍历到一个数字便与字符串数组中的已有的数据进行比较,判断是否重复,若是重复的话就跳过,不重复的话就将其插入字符串数组之中,然后对答案进行自增操作;

我们不难看出,这一部分虽然比较容易想到,但是操作非常复杂,而且时间复杂度也较高,若是字符串较长的话难以成功实施。那么接下来就要介绍我们今天的主角,stl库中的istringstream和unordered_set(也可以使用set(set会对插入的元素自动进行排序, 而unordered_set则是无序插入))。

(2)容器的具体用法在这里我就不过多赘述,具体用法的话大家可以取网络上自行查找资料。在这里我只给出在本题中的两个容器的具体作用。istringstream在本题中可以将创建的新字符串读取成流,同时可以按照空格自动分隔字符串。unordered_set可以自动判断插入的数据是否重复,若是不重复,则插入到容器之中,若是重复则对与容器没有影响。操作结束后,我们直接放回unordered_set的大小即可得到答案。

AC代码如下(仅供参考):

#include <iostream>
#include <string>
#include <sstream>
#include <unordered_set>
using namespace std;

int solution(std::string word) {
    std::string newWord;
    for (char c : word) {
        if (isdigit(c)) {
            newWord.push_back(c);
        } else {
            newWord.push_back(' ');
        }
    }
    istringstream iss(newWord);
    unordered_set<string> uniqueNums;
    string num;
    while (iss >> num) {
        size_t pos = num.find_first_not_of('0');  //判断数字是否有前导0
        if (pos!= string::npos) {
            num = num.substr(pos);
        }
        uniqueNums.insert(num);
    }
    return uniqueNums.size();
}

int main() {
    cout << (solution("a123bc34d8ef34") == 3) << endl;
    cout << (solution("t1234c23456") == 2) << endl;
    cout << (solution("a1b01c001d4") == 2) << endl;

    return 0;
}

总结与感悟: 在C++编程中,合理利用标准库提供的容器和工具类可以大大简化程序的编写。例如,istringstream使得从字符串中读取数据变得非常方便,而unordered_set提供了一种高效的方式来处理不重复元素的集合(集合中的元素具有非重复性)。同时,在处理字符串和数字相关的问题时,需要注意数据的格式转换(可以使用to_string, stoi(str)等实现数字与字符串之间的转换)。这种类型的问题在实际编程中经常遇到。所以,如果还没有学习过stl的同学们,赶紧猛猛学起来啊!!!