题解 不同整数的计数问题| 豆包MarsCode AI刷题

50 阅读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. 变量初始化

    cpp
    string s1 = "";
    int flag = 0;
    set<string> st;
    
    • s1: 用来暂时存储提取的数字子串。
    • st: 一个 set<string> 用来存储不同的数字子串。set 会自动去重,即相同的数字子串只会存储一次。
  2. 遍历字符串

    cpp
    for(int i = 0; i < word.length();){
        if(word[i] < '0' || word[i] > '9'){
            i ++;
        }else{
            while(i < word.length() && word[i] >= '0' && word[i] <= '9'){
                s1 += word[i];
                i ++;
            }
    
    • for (int i = 0; i < word.length();):使用一个 for 循环遍历整个字符串 word
    • if (word[i] < '0' || word[i] > '9'): 如果当前字符不是数字,则直接跳过这个字符(即 i++)。
    • 否则(即当前字符是数字),进入 else 块,继续通过 while 循环提取连续的数字字符。
  3. 提取数字子串

    cpp
    while(i < word.length() && word[i] >= '0' && word[i] <= '9'){
        s1 += word[i];
        i ++;
    }
    
    • 这个 while 循环在字符串中提取连续的数字字符,并将这些数字字符追加到 s1 中。
    • 通过 i++ 来推进 i,直到没有更多的数字字符可以提取,或者已达到字符串末尾。
  4. 处理数字子串

    cpp
    reverse(s1.begin(),s1.end());
    while(s1.size() > 1 && s1.back() == '0') s1.pop_back();
    
    • reverse(s1.begin(), s1.end()): 将提取到的数字子串反转。反转的目的是去除子串中的前导零(因为数字子串可能会有零字符)。
    • while(s1.size() > 1 && s1.back() == '0') s1.pop_back();: 如果数字子串的末尾是零字符(即反转后的前导零),就不断去除这些零,直到没有零字符或子串只有一个字符为止。这里做的是去掉数字子串的前导零。
  5. 存储到集合

    cpp
    if(s1 != "") st.insert(s1);
    s1 = "";
    
    • 如果提取的数字子串 s1 非空,将其插入到 set st 中。由于 set 会自动去重,因此相同的数字子串只会存储一次。
    • 重置 s1 为空字符串,为下一个数字子串做准备。

代码示例

#include <algorithm>
#include <iostream>
#include <string>
#include <set>
using namespace std;

int solution(string word) {
    // write code here
    string s1 = "";
    int flag = 0;
    set<string> st;
    for(int i = 0; i < word.length();){
        if(word[i] < '0' || word[i] > '9'){
            i ++;
        }else{
            while(i < word.length() && word[i] >= '0' && word[i] <= '9'){
                s1 += word[i];
                i ++;
            }
            reverse(s1.begin(),s1.end());
            while(s1.size() > 1 && s1.back() == '0') s1.pop_back();
            if(s1 != "") st.insert(s1);
            s1 = "";
        }
    }
    // for(auto item = st.begin();item != st.end(); item ++){
    //     cout << *item << endl;
    // }
    return st.size();
}