问题描述
小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;
}
代码逻辑详细解释
-
包含必要的头文件:
#include:用于输入输出操作。#include:用于处理字符串。#include:用于存储不同的整数,并自动去重。
-
定义
solution函数:set uniqueNumbers;:使用集合来存储不同的整数。集合会自动去重。string currentNumber = "";:一个临时字符串,用于存储当前正在构建的数字序列。
-
遍历字符串
word:- 使用
for (char c : word)遍历字符串中的每个字符。 - 如果当前字符是数字(
isdigit(c)),将其添加到currentNumber中。 - 如果当前字符不是数字且
currentNumber不为空,则进行以下操作:- 使用
find_first_not_of('0')找到第一个非零字符的位置,去除前导零。 - 如果找到非零字符的位置,将
currentNumber从该位置开始截取。 - 如果全是零,则只保留一个零。
- 将处理后的
currentNumber插入到集合uniqueNumbers中。 - 重置
currentNumber为空字符串,准备处理下一个数字序列。
- 使用
- 使用
-
处理最后一个数字:
- 在遍历结束后,如果
currentNumber不为空,进行同样的处理:- 去除前导零。
- 将处理后的
currentNumber插入到集合uniqueNumbers中。
- 在遍历结束后,如果
-
返回集合的大小:
- 返回
uniqueNumbers.size(),即不同整数的数量。
- 返回
详细步骤
-
初始化:
- 定义一个集合
uniqueNumbers用于存储不同的整数。 - 定义一个空字符串
currentNumber用于临时存储当前的数字序列。
- 定义一个集合
-
遍历字符串:
- 对于字符串中的每个字符
c:- 如果
c是数字,将其添加到currentNumber中。 - 如果
c不是数字且currentNumber不为空:- 使用
find_first_not_of('0')找到第一个非零字符的位置。 - 如果找到了非零字符的位置,将
currentNumber从该位置开始截取。 - 如果全是零,则只保留一个零。
- 将处理后的
currentNumber插入到集合uniqueNumbers中。 - 重置
currentNumber为空字符串。
- 使用
- 如果
- 对于字符串中的每个字符
-
处理最后一个数字:
- 在遍历结束后,如果
currentNumber不为空:- 去除前导零。
- 将处理后的
currentNumber插入到集合uniqueNumbers中。
- 在遍历结束后,如果
-
返回结果:
- 返回
uniqueNumbers的大小,即不同整数的数量。
- 返回
通过这种方式,我们可以正确地提取和处理字符串中的所有整数,并统计不同整数的数量。