开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第14天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你一个字符串 word ,该字符串由数字和小写英文字母组成。
请你用空格替换每个不是数字的字符。例如,"a123bc34d8ef34" 将会变成 " 123 34 8 34" 。注意,剩下的这些整数为(相邻彼此至少有一个空格隔开):"123"、"34"、"8" 和 "34" 。
返回对 word 完成替换后形成的 不同 整数的数目。
只有当两个整数的不含前导零的十进制表示不同, 才认为这两个整数也不同。
示例 1:
输入:word = "a123bc34d8ef34"
输出:3
解释:不同的整数有 "123"、"34" 和 "8" 。注意,"34" 只计数一次。
示例 2:
输入: word = "leet1234code234"
输出: 2
示例 3:
输入:word = "a1b01c001"
输出:1
解释:"1"、"01" 和 "001" 视为同一个整数的十进制表示,因为在比较十进制值时会忽略前导零的存在。
提示:
1 <= word.length <= 1000word由数字和小写英文字母组成
二、思路分析
首先用哈希表记录每个数字。我想到的是用两个指针,但思路比较混乱,始终没有理清。最后看了一些解答才理清了思路。也了解到了isdigit()这个函数,能够判断一个字符是否是数字字符,这无疑对于本题的解答提供了很大的方便。
其次,当遇到了数字字符数时,首先判断该字符是否是数字0的字符形式,如果是的话,则左指针就不能定位于此,直到遇到的第一个数字字符不是0的时候,左指针才能够定位,紧接着就开始定位右指针。
最后将左右指针中间的字符复制到空字符串并添加到哈希表中,以此遍历。
三、AC代码
class Solution {
public:
int numDifferentIntegers(string word) {
unordered_set<string> s;
int len = word.size();
for (int i = 0; i < len; ++i) {
if (isdigit(word[i])) {
while (i < len && word[i] == '0') ++i;
int j = i;
while (j < n && isdigit(word[j])) ++j;
s.insert(word.substr(i, j - i));
i = j;
}
}
return s.size();
}
};
提交排名
四、总结
这题比较简单,但一时半会仍没想到思路,需要继续加强训练。