不同整数的计数问题

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

代码展示

#include #include #include using namespace std;

int solution(string word) { set uniqueNumbers; string currentNumber = "";

for (char c : word) {
    if (isdigit(c)) {
        currentNumber += c;
    } else if (!currentNumber.empty()) {
        // 去除前导零
        size_t nonZeroPos = currentNumber.find_first_not_of('0');
        if (nonZeroPos != string::npos) {
            currentNumber = currentNumber.substr(nonZeroPos);
        }
        uniqueNumbers.insert(currentNumber);
        currentNumber = "";
    }
}

// 处理最后一个数字
if (!currentNumber.empty()) {
    size_t nonZeroPos = currentNumber.find_first_not_of('0');
    if (nonZeroPos != string::npos) {
        currentNumber = currentNumber.substr(nonZeroPos);
    }
    uniqueNumbers.insert(currentNumber);
}

return uniqueNumbers.size();

}

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

return 0;

}

代码逻辑详细解释

  1. 包含必要的头文件

    • #include :用于输入输出操作。
    • #include :用于处理字符串。
    • #include :用于存储不同的整数,并自动去重。
  2. 定义 solution 函数

    • set uniqueNumbers;:使用集合来存储不同的整数。集合会自动去重。
    • string currentNumber = "";:一个临时字符串,用于存储当前正在构建的数字序列。
  3. 遍历字符串 word

    • 使用 for (char c : word) 遍历字符串中的每个字符。
    • 如果当前字符是数字(isdigit(c)),将其添加到 currentNumber 中。
    • 如果当前字符不是数字且 currentNumber 不为空,则进行以下操作:
      • 使用 find_first_not_of('0') 找到第一个非零字符的位置,去除前导零。
      • 如果找到非零字符的位置,将 currentNumber 从该位置开始截取。
      • 如果全是零,则只保留一个零。
      • 将处理后的 currentNumber 插入到集合 uniqueNumbers 中。
      • 重置 currentNumber 为空字符串,准备处理下一个数字序列。
  4. 处理最后一个数字

    • 在遍历结束后,如果 currentNumber 不为空,进行同样的处理:
      • 去除前导零。
      • 将处理后的 currentNumber 插入到集合 uniqueNumbers 中。
  5. 返回集合的大小

    • 返回 uniqueNumbers.size(),即不同整数的数量。

详细步骤

  1. 初始化

    • 定义一个集合 uniqueNumbers 用于存储不同的整数。
    • 定义一个空字符串 currentNumber 用于临时存储当前的数字序列。
  2. 遍历字符串

    • 对于字符串中的每个字符 c
      • 如果 c 是数字,将其添加到 currentNumber 中。
      • 如果 c 不是数字且 currentNumber 不为空:
        • 使用 find_first_not_of('0') 找到第一个非零字符的位置。
        • 如果找到了非零字符的位置,将 currentNumber 从该位置开始截取。
        • 如果全是零,则只保留一个零。
        • 将处理后的 currentNumber 插入到集合 uniqueNumbers 中。
        • 重置 currentNumber 为空字符串。
  3. 处理最后一个数字

    • 在遍历结束后,如果 currentNumber 不为空:
      • 去除前导零。
      • 将处理后的 currentNumber 插入到集合 uniqueNumbers 中。
  4. 返回结果

    • 返回 uniqueNumbers 的大小,即不同整数的数量。

通过这种方式,我们可以正确地提取和处理字符串中的所有整数,并统计不同整数的数量。