1.题目
问题描述
小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
2.思路
- 遍历字符串:
- 如果当前字符是数字 (
isdigit(ch)
),将其追加到currentNumber
。 - 如果遇到非数字字符,检查
currentNumber
是否为空:- 如果不为空,去除其前导零,并将其加入到集合
uniqueNumbers
中。 - 然后将
currentNumber
清空。
- 如果不为空,去除其前导零,并将其加入到集合
- 如果当前字符是数字 (
- 处理最后一个数字:
- 字符串结束后,如果
currentNumber
非空,执行相同的去前导零和加入集合的操作。
- 字符串结束后,如果
- 集合去重:
set
数据结构会自动去重,确保只记录不同的数字。
- 返回结果:
- 集合的大小即为不同整数的数量。
3.代码
#include <iostream>
#include <string>
#include <set>
using namespace std;
int solution(string word) {
// PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE
// write code here
set<string> unidqueNumbers; //用集合存储不同的整数
string currentNumber = ""; // 临时变量,用来拼接数字
for (char ch : word) {
if (isdigit(ch)) {
currentNumber += ch;
} else {
// 如果遇到非数字字符,处理当前数字
if (!currentNumber.empty()) {
// 去除前导零并加入到 set 中
while (currentNumber.size() > 1 && currentNumber[0] == '0') {
// 表示从位置0开始删除一个字符
currentNumber.erase(0, 1);
}
unidqueNumbers.insert(currentNumber);
currentNumber = "";
}
}
}
// 遇到非数字才会处理数字,所以要处理字符串最后的数字
if (!currentNumber.empty()) {
// 去除前导零并加入到 set 中
while (currentNumber.size() > 1 && currentNumber[0] == '0') {
// 表示从位置0开始删除一个字符
currentNumber.erase(0, 1);
}
unidqueNumbers.insert(currentNumber);
}
return unidqueNumbers.size();
}
int main() {
cout << (solution("a123bc34d8ef34") == 3) << endl;
cout << (solution("t1234c23456") == 2) << endl;
cout << (solution("a1b01c001d4") == 2) << endl;
return 0;
}
currentNumber.erase(pos, len);
pos
:表示起始位置(从 0 开始的索引)。len
:表示要删除的字符数。currentNumber.erase(0, 1)
表示从currentNumber
字符串的第一个字符(即索引为 0 的字符)开始,删除 1 个字符。- 换句话说,这行代码会删除
currentNumber
字符串中的第一个字符。