题目选择:### 问题描述
小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'的字符的位置。
- 返回不同整数的数目:
return unique_numbers.size();
返回 unordered_set 的大小,即不同整数的数目。
测试样例
- 样例1:
solution("a123bc34d8ef34") == 3
输出:1(表示测试通过)
- 样例2:
solution("t1234c23456") == 2
输出 1(表示测试通过)
- 样例3:
solution("a1b01c001d4") == 2
输出 1(表示测试通过)
总结
通过将非数字字符替换为空格,然后使用 stringstream 分割字符串并提取整数,最后使用 unordered_set 去重并统计不同整数的数目,我们可以高效地解决这个问题。