问题描述
小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"。
- 提取整数为:
123、34、8、34。 - 不同整数为:
123、34、8。 - 输出:
3。
样例 2
输入:word = "t1234c23456"
- 替换后形成:" 1234 23456"。
- 提取整数为:
1234、23456。 - 不同整数为:
1234、23456。 - 输出:
2。
样例 3
输入:word = "a1b01c001d4"
- 替换后形成:" 1 01 001 4"。
- 提取整数为:
1、01、001、4。 - 忽略前导零,不同整数为:
1、4。 - 输出:
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;
}
代码实现
变量定义
-
unordered_set<int> ans:- 用于存储不同的整数值。
- 使用
unordered_set是因为它可以自动过滤掉重复的整数。
-
sum:- 未使用到,可以忽略。
-
fast和slow:fast:快速指针,用于遍历字符串。slow:慢速指针,用于记录数字的起始位置。
主循环逻辑
-
遍历字符串:
- 遍历
word的字符,从fast=0开始到字符串结束。
- 遍历
-
非数字字符检测:
-
如果当前字符
word[fast]是小写字母:-
判断
fast != slow:检查是否存在一个数字段。 -
如果存在:
- 将
slow到fast-1的数字段取出,并转换为整数stoi。 - 插入到
ans集合中。 - 更新
slow的位置(slow = fast + 1)。
- 将
-
如果不存在数字段,则
fast++和slow++,继续向前推进。
-
-
-
数字字符检测:
- 如果是数字,直接移动
fast++。
- 如果是数字,直接移动
收尾处理
当遍历完成后,如果字符串的最后一个字符是数字,需要特殊处理:
- 从
slow开始一直到字符串末尾取出数字段。 - 转换为整数
stoi,并插入到ans集合中。
返回结果
返回 ans.size(),即集合中不同整数的数量。