伴学笔记| 豆包MarsCode AI刷题

53 阅读3分钟

题目选择:### 问题描述

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

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

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

测试样例

样例1:

输入:word = "a123bc34d8ef34"
输出:3

样例2:

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

样例3:

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

解题思路

1.替换非数字字符:遍历输入给出的字符串,将非数字的字符用空格代替。

2.分割字符串:再次遍历字符串,以空格为界分割,记录余下的整数

3.去重:使用unordered_set容器可以轻松做到对所记录的整数进行去重操作

4.返回容器的容量,即结果。

代码实现

#include <bits/stdc++.h>
using namespace std;

int solution(string word) {
    // 1. 替换非数字字符为空格
    
    
    // 2. 使用空格分割字符串,提取整数
    unordered_set<string> unique_numbers;
    stringstream ss(word);
    string num;
    while (ss >> num) {
        // 去除前导零
        num.erase(0, num.find_first_not_of('0'));
        if (num.empty()) num = "0"; // 处理全为零的情况
        unique_numbers.insert(num);
    }
    
    // 3. 返回不同整数的数目
    return unique_numbers.size();
}

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

    return 0;
}

代码解释

1.替换非数字字符,这里使用到isdigit()函数,它可以用来判断传入的参数是否为数字字符。

for (char &c : word) {
        if (!isdigit(c)) {
            c = ' ';
        }
    }

2.分割字符串并记录整数

unordered_set<string> unique_numbers;
stringstream ss(word);
string num;
while (ss >> num) {
    num.erase(0, num.find_first_not_of('0'));
    if (num.empty()) num = "0";
    unique_numbers.insert(num);
}

使用 stringstream 将字符串按空格分割,提取出所有的整数。然后去除每个整数的前导零,并将其存入 unordered_set 中。 其中,find_first_not_of()函数用来查找在num中第一个不为'0'的字符的位置。

  1. 返回不同整数的数目
    return unique_numbers.size();

返回 unordered_set 的大小,即不同整数的数目。

测试样例

  • 样例1
    solution("a123bc34d8ef34") == 3

输出:1(表示测试通过)

  • 样例2
    solution("t1234c23456") == 2

输出 1(表示测试通过)

  • 样例3
    solution("a1b01c001d4") == 2

输出 1(表示测试通过)

总结

通过将非数字字符替换为空格,然后使用 stringstream 分割字符串并提取整数,最后使用 unordered_set 去重并统计不同整数的数目,我们可以高效地解决这个问题。