题目
1 概念梳理
1.1 ISet<T> HashSet<T>
包含不重复元素的集合称为“集set”。.NET Framework包含两个集HashSet<T>和SortedSet<T>,其中HashSet<T>包含不重复元素的无序列表,SortedSet<T>包含不重复元素的有序列表。
ISet<T>接口提供的方法可以创建合集,交集。
1.2 Char.IsDigit()
参考:C# Char.IsDigit()用法及代码示例 - 纯净天空 (vimsky.com)
是一种检查Unicode字符是否可以归类为十进制数,有两种:
Char.IsDigti(Char)——检查指定的字符是否为十进制数
Char.IsDigti(String, Int)——指定位置的指定字符串是否与十进制数匹配
1.3 数字问题,去除前导0
去除前导零的意思就是,有时经过判断后输出的必须是有实际意义的数字,那么“01”“0001”与1意义相同。所以需要加上一步”判断是否为0且去除“的操作。
1.4 对HashSet的操作
C# HashSet 用法_IT技术猿猴的博客-CSDN博客_c# hashset
点入链接,直接回顾一下C#中哈希添加和删除清空等修改操作。
1.5 正则表达式
参考:
正则表达式的一些术语
包括有a到z之间的字母,还有一些特殊字符。例如这道题后面还想除了一种解法,但是很奇怪用时会超出。
2 解题
老老实实用双指针,最后去除前导零就行。
public class Solution {
public int NumDifferentIntegers(string word) {
HashSet<string> str = new HashSet<string>();
int n = word.Length;
int p1, p2=0;
while(true) {
while(p2<n&&!Char.IsDigit(word[p2])) {
p2++; //until:
}
if(p2==n) {
break;
}
p1=p2;
while(p2<n&&Char.IsDigit(word[p2])) {
p2++;
}
while(p1+1<p2&&word[p1]=='0') {
p1++;
}
str.Add(word.Substring(p1, p2 - p1));
}
return str.Count;
}
}
另外在力扣网还看到了用正则巧妙地做的答案:[Java/C++] 简单模拟题 - 字符串中不同整数的数目 - 力扣(LeetCode)
class Solution {
public int numDifferentIntegers(String word) {
Set<String> set = new HashSet<>();
for (String str : word.split("[a-z]+")) if (str.length() > 0) set.add(str.replaceAll("^0+",""));
return set.size();
}
}