1. 程式人生 > >C#leetcode刷題929獨特的電子郵件地址

C#leetcode刷題929獨特的電子郵件地址

題目描述

每封電子郵件都由一個本地名稱和一個域名組成,以 @ 符號分隔。

例如,在 [email protected]中, alice 是本地名稱,而 leetcode.com 是域名。

除了小寫字母,這些電子郵件還可能包含 ',' 或 '+'

如果在電子郵件地址的本地名稱部分中的某些字元之間新增句點('.'),則發往那裡的郵件將會轉發到本地名稱中沒有點的同一地址。例如,"[email protected] 和 [email protected] 會轉發到同一電子郵件地址。 (請注意,此規則不適用於域名。)

如果在本地名稱中新增加號('+'),則會忽略第一個加號後面的所有內容。這允許過濾某些電子郵件,例如 [email protected] 將轉發到 [email protected]。 (同樣,此規則不適用於域名。)

可以同時使用這兩個規則。

給定電子郵件列表 emails,我們會向列表中的每個地址傳送一封電子郵件。實際收到郵件的不同地址有多少?

示例

輸入:["[email protected]","[email protected]","[email protected]"]
輸出:2
解釋:
實際收到郵件的是 "[email protected]" 和 "[email protected]"。

解題

public class Solution {
    public int NumUniqueEmails(string[] emails) {
        HashSet<string> set = new HashSet<string>();
            for (int i = 0; i < emails.Count(); i++)
            {
                //本地名稱
                string name = emails[i].Substring(0, emails[i].IndexOf("@"));
                //域名
                string domain = emails[i].Substring(emails[i].IndexOf("@"));
                //根據指定規則解析後的本地名稱,先按加號切割字串,然後替換'.'
                string newName = name.Substring(0, name.IndexOf("+")).Replace(".", "");
                //使用HashSet去重
                set.Add(newName + domain);
            }
            return set.Count();
    }
}

知識補充 

 1.在C#中引入HashSet

 https://www.cnblogs.com/Javi/p/6794660.html

在.NET框架中,有幾個類可用於執行這些操作。一些課程如下:

  • 列表
  • 字典
  • 雜湊集
  • 佇列

集合

在C#程式設計中,像ArrayList,List這樣的集合,只需新增其中的值,而不檢查任何重複。為了避免這種重複的資料儲存,.NET提供集合名稱集。這是一個具有不同專案的集合型別。

有兩種型別的集合,SortedSet和HastSet。SortedSet按照排序順序儲存資料,也可以消除重複。

雜湊集 vs SortedSet

這兩個類都儲存非重複的專案。但是,如果要執行效能,並且不關心專案是否未分類儲存,則進入HashSet。但是,如果您希望專案在插入後進行排序,但可以進行效能打擊,請選擇“排序”。

本文分為六個部分,分別如下:

第1節:HastSet的特點 
第2節:消除HashSet中的重複資料條目 
第3節:使用UnionWith()方法修改HashSet方法 
第4節:使用ExceptWith()方法 
修改Hashset第5節:使用SymmetricExceptWith()方法修改Hashset 
第6節:檢查新增,刪除等操作的效能,包含HashSet和List。

讓我們開始吧

第1節:HastSet的特點

這是HashSet的一些突出特點。

  • 這個類代表一組值。
  • 這個類提供了高效能的操作。
  • 這是一組不包含重複元素的集合,並且其中儲存的元素沒有特定的順序。
  • 在.NET Framework 4.6版本中,HashSet 實現IReadOnlyCollection 介面連同ISet 介面。
  • 雜湊集類對其中儲存的元素數量沒有任何最大容量。隨著元素數量的增加,這種容量不斷增加。

第2節:消除C#HashSet中的重複

步驟1:開啟Visual Studio並建立名稱為CS_Using_HashSet的控制檯應用程式。

步驟2:在Program.cs的Main()方法中,新增以下程式碼

using System;

using System.Collections.Generic;

 

namespace CS_Using_HashSet

{

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("Using HashSet");

            //1. Defining String Array (Note that the string "mahesh" is repeated)

            string[] names = new string[] {

                "mahesh",

                "vikram",

                "mahesh",

                "mayur",

                "suprotim",

                "saket",

                "manish"

            };

            //2. Length of Array and Printing array

            Console.WriteLine("Length of Array " + names.Length);

            Console.WriteLine();

            Console.WriteLine("The Data in Array");

            foreach (var n in names)

            {

                Console.WriteLine(n);

            }

 

            Console.WriteLine();

            //3. Defining HashSet by passing an Array of string to it

            HashSet< string > hSet = new HashSet< string >(names);

            //4. Count of Elements in HashSet

            Console.WriteLine("Count of Data in HashSet " + hSet.Count);

            Console.WriteLine();

            //5. Printing Data in HashSet, this will eliminate duplication of "mahesh"

            Console.WriteLine("Data in HashSet");

            foreach (var n in hSet)

            {

                Console.WriteLine(n);

            }    

            Console.ReadLine();

        }

    }

}

上述程式碼具有以下規格(注:程式碼中的註釋號與以下編號相符)

1.宣告一個名稱名稱的字串陣列,它在其中儲存名稱。該陣列具有字串“mahesh”的重複條目。

2.列印其中的陣列長度和資料。

3.定義一個型別為字串的HashSet 。該物件使用陣列進行初始化,該陣列自動從陣列中新增HashSet中的項。

4.如第1節所述,HashSet物件不允許重複輸入,因此結果將顯示HashSet中存在的資料的計數小於陣列計數。

5.在HashSet中顯示資料。

執行應用程式,並顯示以下結果:

雜湊集 - 重複消除

第3節:使用UnionWith()方法修改HashSet

UnionWith()方法用於修改HashSet,以包含其中存在的所有元素以及與其建立聯合的其他(IEnumerable)集合中的元素。

以下程式碼是UnionWith()上的實現。

步驟1:在專案的Main()方法中新增以下程式碼。

string[] names1 = new string[] {

    "mahesh","sabnis","manish","sharma","saket","karnik"

};

 

string[] Names2 = new string[] {

    "suprotim","agarwal","vikram","pendse","mahesh","mitkari"

};

//2.

 

HashSet< string > hSetN1 = new HashSet< string >(Names1);

Console.WriteLine("Data in First HashSet");

foreach (var n in hSetN1)

{

    Console.WriteLine(n);

}

Console.WriteLine("_______________________________________________________________");

HashSet< string > hSetN2 = new HashSet< string >(names2);

Console.WriteLine("Data in Second HashSet");

foreach (var n in hSetN2)

{

    Console.WriteLine(n);

}

Console.WriteLine("________________________________________________________________");

//3.

Console.WriteLine("Data After Union");

hSetN1.UnionWith(hSetN2);

foreach (var n in hSetN1)

{

    Console.WriteLine(n);

}

以上程式碼具有以下規格(注:以下編號與註釋相符)。

陣列物件宣告Name1和Names2,其中包含字串資料。

2.本步驟定義了兩個HashSet的物件hSetN1和hSetN2基於names1和names2分別和來自兩個HashSet的資料被列印。

此步驟在hSetN1上呼叫UnionWith()方法,並將hSetN2 物件傳遞給它,並在union之後顯示hSetN1中的所有資料。

執行應用程式,將顯示以下結果:

hashset-unionwith

第4節:使用ExceptWith()方法修改雜湊集

該方法用於通過刪除與其他集合中的元素匹配的所有元素來修改HashSet。

步驟1:在Main()方法中新增以下程式碼。程式碼使用第3節中宣告的hSetN2,並使用names1陣列宣告一個新的HashSet,該陣列用於宣告hSetN1。

Console.WriteLine();

Console.WriteLine("_________________________________");

Console.WriteLine("Data in HashSet before using Except With");

Console.WriteLine("_________________________________");

//storing data of hSetN3 in temporary HashSet

HashSet< string > hSetN3 = new HashSet< string >(names1);

foreach (var n in hSetN3)

{

    Console.WriteLine(n);

}

Console.WriteLine();

Console.WriteLine("_________________________________");

Console.WriteLine("Using Except With");

Console.WriteLine("_________________________________");

hSetN3.ExceptWith(hSetN2);

foreach (var n in hSetN3)

{

    Console.WriteLine(n);

}

執行應用程式後,將顯示以下結果:

除了結果

上述結果表明,當通過將hSetN2引數傳遞給hSetN2 HashSet的ExceptWith()方法時,從hSetN3中刪除匹配的字串“mahesh”,並顯示剩餘的字串。

 

第5節:使用 SymmetricExceptWith()方法修改Hashset

 

此方法修改HashSet物件以包含僅存在於兩個集合之一中的那些元素,但不能同時包含兩個。

所有匹配的元素將被刪除。

步驟1:在Main()方法中新增以下程式碼。程式碼useshSetN2在第3節中宣告,並使用陣列names1宣告一個新的HashSet hSet4。

HashSet< string > hSetN4 = new HashSet< string >(names1);

Console.WriteLine("_________________________________");

Console.WriteLine("Elements in HashSet before using SymmetricExceptWith");

Console.WriteLine("_________________________________");

Console.WriteLine("HashSet 1");

foreach (var n in hSetN4)

{

    Console.WriteLine(n);

}

Console.WriteLine("HashSet 2");

foreach (var n in hSetN2)

{

    Console.WriteLine(n);

}

Console.WriteLine("_________________________________");

Console.WriteLine("Using SymmetricExceptWith");

Console.WriteLine("_________________________________");

hSetN4.SymmetricExceptWith(hSetN2);

foreach (var n in hSetN4)

{

    Console.WriteLine(n);

}

通過將hSetN2 HashSet傳遞給它,在HSetN4 HashSet上呼叫SymmetircExceptWith()方法。這兩個HashSets都包含一個字串名稱“mahesh”。

通過消除匹配的條目,hSetN4將與hSetN2的值合併。執行應用程式後,結果如下:

對稱除結果

第6節:檢查HashSet vs List上的新增,刪除,包含操作的效能。

以上所有部分都介紹了HashSet的各種方法。

但是,當開發人員想要根據效能選擇最合適的集合型別作出決定時,重要的是要檢查哪些操作經常在集合上執行。

通常,新增,刪除,包含是對記憶體中集合執行的操作。要執行List和HashSet之間的新增,刪除和包含操作的比較,使用以下字串陣列。(注:您可以使用任何其他資料)

static string[] names = new string[] {

    "Tejas", "Mahesh", "Ramesh", "Ram", "GundaRam", "Sabnis", "Leena",

    "Neema", "Sita" , "Tejas", "Mahesh", "Ramesh", "Ram",

    "GundaRam", "Sabnis", "Leena", "Neema", "Sita" ,

    "Tejas", "Mahesh", "Ramesh", "Ram", "GundaRam",

    "Sabnis", "Leena", "Neema", "Sita" , "Tejas",

    "Mahesh", "Ramesh", "Ram", "GundaRam", "Sabnis",

    "Leena", "Neema", "Sita",

    "Tejas", "Mahesh", "Ramesh", "Ram", "GundaRam", "Sabnis", ……            };

(字串總數為:550)

將以下方法新增到Program.cs

static void Get_Add_Performance_HashSet_vs_List()

{

     

    Console.WriteLine("____________________________________");

    Console.WriteLine("List Performance while Adding Item");

    Console.WriteLine();

    List< string > lstNames = new List< string >();

    var s2 = Stopwatch.StartNew();

    foreach (string s in names)

    {

        lstNames.Add(s);

    }

    s2.Stop();

 

    Console.WriteLine(s2.Elapsed.TotalMilliseconds.ToString("0.000 ms"));            Console.WriteLine();

    Console.WriteLine("Ends Here");

    Console.WriteLine();

    Console.WriteLine("____________________________________");

    Console.WriteLine("HashSet Performance while Adding Item");

    Console.WriteLine();

    

    HashSet< string > hStringNames = new HashSet< string >(StringComparer.Ordinal);

    var s1 = Stopwatch.StartNew();

    foreach (string s in names)

    {

        hStringNames.Add(s);

    }

    s1.Stop();

 

    Console.WriteLine(s1.Elapsed.TotalMilliseconds.ToString("0.000 ms"));            Console.WriteLine();

    Console.WriteLine("Ends Here");

    Console.WriteLine("____________________________________");

    Console.WriteLine();

    

}

HashSet vs List - Add()方法

上述方法通過從名稱陣列中迭代字串對List和HashSet執行Add()操作。

操作的效能是通過計算秒錶從類System.Diagnostics程式名稱空間。

執行應用程式,並顯示以下結果:

請注意,下面的結果顯示了時間差我的機器,它可以執行樣本時,您的計算機上有所不同。

加成專案

與HashSet相比,List <>花費更少的時間來新增字串。

原因之一是List.Add()只是將一個專案新增到列表,而HashSet.Add()將跳過新專案(如果它等於其中一個現有專案)。與List.Add()方法相比,這需要時間來執行HashSet.Add()方法。

HashSet vs List - Contains()方法

在Program.cs中新增以下方法

static void Get_Contains_Performance_HashSet_vs_List()

{

  

    Console.WriteLine("____________________________________");

    Console.WriteLine("List Performance while checking Contains operation");

    Console.WriteLine();

    List< string > lstNames = new List< string >();

    var s2 = Stopwatch.StartNew();

    foreach (string s in names)

    {

        lstNames.Contains(s);

    }

    s2.Stop();

 

    Console.WriteLine(s2.Elapsed.TotalMilliseconds.ToString("0.000 ms"));            Console.WriteLine();

    Console.WriteLine("Ends Here");

    Console.WriteLine();

    Console.WriteLine("____________________________________");

    Console.WriteLine("HashSet Performance while checking Contains operation");

    Console.WriteLine();

 

    HashSet< string > hStringNames = new HashSet< string >(StringComparer.Ordinal);

    var s1 = Stopwatch.StartNew();

    foreach (string s in names)

    {

        hStringNames.Contains(s);

    }

    s1.Stop();

 

    Console.WriteLine(s1.Elapsed.TotalMilliseconds.ToString("0.000 ms"));

    Console.WriteLine();

    Console.WriteLine("Ends Here");

    Console.WriteLine("____________________________________");

    Console.WriteLine();

 

}

上述方法檢查List和HashSet是否包含作為輸入引數傳遞給Contains()方法的項。執行應用程式,結果將顯示如下圖所示

包含操作

結果清楚地表明,HashSet提供了比List更快的查詢元素。

這是因為HashSet中沒有重複的資料。HashSet為其中的每個專案維護雜湊,並將它們排列在單獨的桶中,​​其中包含儲存在HashSet中的專案的每個字元的雜湊。

當查詢發生時,HashSet會將其從第一個字元開始進行雜湊並將其跳轉到匹配的每個字元,並從HashSet中提取元素。

HashSet vs List - Remove()方法

在Program.cs中新增以下方法

static void Get_Remove_Performance_HashSet_vs_List()

{

   

    Console.WriteLine("____________________________________");

    Console.WriteLine("List Performance while performing Remove item operation");

    Console.WriteLine();

    List< string > lstNames = new List< string >();

    var s2 = Stopwatch.StartNew();

    foreach (string s in names)

    {

        lstNames.Remove(s);

    }

    s2.Stop();

 

    Console.WriteLine(s2.Elapsed.TotalMilliseconds.ToString("0.000 ms"));            Console.WriteLine();

    Console.WriteLine("Ends Here");

    Console.WriteLine();

    Console.WriteLine("____________________________________");

    Console.WriteLine("HashSet Performance while performing Remove item operation");

    Console.WriteLine();

 

    HashSet< string > hStringNames = new HashSet< string >(StringComparer.Ordinal);

    var s1 = Stopwatch.StartNew();

    foreach (string s in names)

    {

        hStringNames.Remove(s);

    }

    s1.Stop();

 

    Console.WriteLine(s1.Elapsed.TotalMilliseconds.ToString("0.000 ms"));            Console.WriteLine();

    Console.WriteLine("Ends Here");

    Console.WriteLine("____________________________________");

    Console.WriteLine();

 

}

上述方法使用Remove()方法執行List和HashSet上的刪除操作。執行應用程式,結果將顯示如下圖所示:

執行刪除操作

上圖清楚地顯示了HashSet的刪除操作比List更快。“刪除”操作也與“包含”操作類似。

Thanks & Best Regards! Javi Zhu 朱佳輝 Mobile: 15900467108 Email: [email protected]

 2.C#中字串的操作

 原文連結:

https://www.cnblogs.com/whl4835349/p/5736430.html

 1.Replace(替換字元)

public string Replace(char oldChar,char newChar);在物件中尋找oldChar,如果尋找到,就用newChar將oldChar替換掉。

string str = "abcde";
string newStr = str.Replace('a','x');
Console.WriteLine(newStr);

public string Replace(string oldString,string newString);在物件中尋找oldString,如果尋找到,就用newString將oldString替換掉。

string st = "abcdef";
string newstring = st.Replace("abc", "xyz");
 Console.WriteLine(newstring); 

2.Remove(刪除字元)

public string Remove(int startIndex);從startIndex位置開始,刪除此位置後所有的字元(包括當前位置所指定的字元)。

string str = "abcde";
string newStr=str.Remove(4);
Console.WriteLine(newStr);//輸出abcd

 public string Remove(int startIndex,int count);從startIndex位置開始,刪除count個字元。

string str = "abcde";
string newStr=str.Remove(2,2);
Console.WriteLine(newStr);//輸出abe

3.Substring(字串提取)

public string Substring(int startIndex);從startIndex位置開始,提取此位置後所有的字元(包括當前位置所指定的字元)。

string str = "abcde";
string newStr = str.Substring(2);
 Console.WriteLine(newStr);//輸出cde

 public string Substring(int startIndex,int count);從startIndex位置開始,提取count個字元。

string str = "abcde";
string newStr = str.Substring(2,2);
Console.WriteLine(newStr);//輸出cd

 

4.Trim(清空空格)

public string Trim ():將字串物件包含的字串       兩邊   的空格去掉後返回

public string Trim ( params char[] trimChars ):從此例項的開始和末尾移除陣列中指定的一組字元的所有匹配項。

string str ="abcdef";
string newStr = str.Trim(new char[] {'a'});//尋找st字串中開始與末尾是否有與'a'匹配,如有,將其移除。
Console.WriteLine(newStr); //即:bcdef

注:如果字串為"aaaabcdef",返回依然為bcdef。當移除第一個a時,開始依然為a,繼續移除,直到沒有。
public string TrimEnd ( params char[] trimChars ):對此例項末尾與指定字元進行匹配,true則移除
public string TrimStart ( params char[] trimChars ):對此例項開始與指定字元進行匹配,true則移除

 

5.ToLower(轉換大小寫)

public string ToLower():將字串物件包含的字串中的大寫全部轉換為小寫

6.IndexOf(獲取指定的字串的開始索引)

public int IndexOf (sring field):在此例項中尋找field,如果尋找到,返回開始索引,反之,返回-1

string str = "abcdef";
int num = str.IndexOf("bcd");
Console.WriteLine(num);  //即:1

7.Equals(是否相等)

public bool Equals (string value):比較呼叫方法的字串物件包含字串和引數給出的物件是否相同,如相同,就返回true,反之,返回false。

string a = "abcdef";
bool b = a.Equals("bcdef");
Console.WriteLine(b);//即:false

 public bool Equals ( string value, StringComparison comparisonType ):比較呼叫方法的字串物件包含字串和引數給出的物件是否在不區分大小寫的情況下相同,如相同,就返回true,反之,返回false,第二個引數將指定區域性、大小寫以及比較所用的排序規則.

string a = "ABCDEF";
bool b = a.Equals("abcdef", StringComparison.CurrentCultureIgnoreCase);
Console.WriteLine(b);//即:true

8.Split(拆分)

public string[] Split ( params char[] separator ):根據separator 指定的沒有字元分隔此例項中子字串成為Unicode字元陣列, separator可以是不包含分隔符的空陣列或空引用。
public string[] Split ( char[] separator, int count ):引數count 指定要返回的子字串的最大數量

            string st = "語文|數學|英語|物理";
            string[] split = st.Split(new char[] { '|' }, 3);
            for (int i = 0; i < split.Length; i++)
            {
                Console.WriteLine(split[i]);
            }
            /*
             語文
             數學
             英語|物理
             */
            //注:count不填則全部拆分

public enum StringSplitOptions 
成員名稱            說明
None                返回值包括含有空字串的陣列元素//
RemoveEmptyEntries  返回值不包括含有空字串的陣列元素

string[] split = st.Split(new char[]{'|'},StringSplitOptions.None);
string[] split = st.Split(new char[]{'|'},StringSplitOptions.RemoveEmptyEntries);

string st = "語文|數學||英語|物理";
            string[] split = st.Split(new char[]{'|'},StringSplitOptions.RemoveEmptyEntries);
            for (int i = 0; i < split.Length; i++)
            {
                Console.WriteLine(split[i]);
            }

 

9.Contains(判斷是否存在)

public bool Contains(string text):如果字串中出現text,則返回true,反之false,如果text為("")也返回true。

 string st="語文數學英語";
 bool b=st.Contains("語文");
 Console.WriteLine(b);//true

 

10.EndsWith  StartsWith(判斷是否存在)

public bool EndsWith ( string value ):判斷物件包含字串是否以value指定的字串結束,是則為 true;否則為 false。 
public bool EndsWith ( string value, StringComparison comparisonType ):第二個引數設定比較時區域、大小寫和排序規則。
public bool StartsWith ( string value ):判斷物件包含字串是否以value指定的字串開始,是則為 true;否則為 false。 
public bool StartsWith ( string value, StringComparison comparisonType ) :第二個引數設定比較時區域、大小寫和排序規則。

string st = "語文數學英語abc";
bool b = st.EndsWith("英語ABC", StringComparison.CurrentCultureIgnoreCase);//第二個引數忽略大小比較。
Console.WriteLine(b);//true

11.Insert(字元插入)

public string Insert ( int startIndex, string value ):在指定的字串下標為startIndex前插入字串value。返回插入後的值。

string st="語文數學英語abc";
 string newst=st.Insert(6,"物理");//注:在指定索引“前”插入。
 Console.WriteLine(newst);//即:語文數學英語物理abc