【刷题心得1】双指针法|HashSet<T>

题目

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();
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41835314/article/details/128201978