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

44 阅读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

输入:word = "a123bc34d8ef34"

  • 替换后形成:" 123 34 8 34"。
  • 提取整数为:12334834
  • 不同整数为:123348
  • 输出:3

样例 2

输入:word = "t1234c23456"

  • 替换后形成:" 1234 23456"。
  • 提取整数为:123423456
  • 不同整数为:123423456
  • 输出:2

样例 3

输入:word = "a1b01c001d4"

  • 替换后形成:" 1 01 001 4"。
  • 提取整数为:1010014
  • 忽略前导零,不同整数为:14
  • 输出:2

任务描述

代码的目标是统计字符串 word 中经过非数字字符替换为空格后,剩余的整数中不同整数的个数,忽略前导零。


代码

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

int solution(string word) {
  // write code here
  unordered_set<int> ans;
  int sum = 0;
  int fast = 0;
  int slow = 0;
  while (fast < word.size()) {
    if (word[fast] >= 'a' && word[fast] <= 'z') {
      if (fast != slow) {
        string num = "";
        for (int i = slow; i < fast; i++) {
          num = num + word[i];
        }
        ans.insert(stoi(num));
        slow = fast;
        slow++;
        fast++;
      } else {
        fast++;
        slow++;
      }
    } else {
      fast++;
    }
  }
  if (word[word.size() - 1] >= '0' && word[word.size() - 1] <= '9') {
    string num = "";
    for (int i = slow; i < word.size(); i++) {
      num = num + word[i];
    }
    ans.insert(stoi(num));
  }
  return ans.size();
}

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

  return 0;
}

代码实现

变量定义

  1. unordered_set<int> ans:

    • 用于存储不同的整数值。
    • 使用 unordered_set 是因为它可以自动过滤掉重复的整数。
  2. sum:

    • 未使用到,可以忽略。
  3. fastslow:

    • fast:快速指针,用于遍历字符串。
    • slow:慢速指针,用于记录数字的起始位置。

主循环逻辑

  1. 遍历字符串:

    • 遍历 word 的字符,从 fast=0 开始到字符串结束。
  2. 非数字字符检测:

    • 如果当前字符 word[fast] 是小写字母:

      • 判断 fast != slow:检查是否存在一个数字段。

      • 如果存在:

        • slowfast-1 的数字段取出,并转换为整数 stoi
        • 插入到 ans 集合中。
        • 更新 slow 的位置(slow = fast + 1)。
      • 如果不存在数字段,则 fast++slow++,继续向前推进。

  3. 数字字符检测:

    • 如果是数字,直接移动 fast++

收尾处理

当遍历完成后,如果字符串的最后一个字符是数字,需要特殊处理:

  • slow 开始一直到字符串末尾取出数字段。
  • 转换为整数 stoi,并插入到 ans 集合中。

返回结果

返回 ans.size(),即集合中不同整数的数量。