概要
エンジニア職での就職・転職では会社によってはコーディングテストというものがあります。
新卒でも中途でも入社したい会社というのは誰でもいい環境を求めるのではないでしょうか。
そこで、コーディングテストで振り落とされないためにもLeetCodeというテスト対策ができるサイトでアルゴリズム力を鍛えたいと思います。
問題
すべての有効な電子メールは、ローカル名とドメイン名からなり、’@’記号で区切られています。小文字の他に、メールには1つ以上の「.」または「+」を含めることができます。
- 例えば、「alice@leetcode.com」では、「alice」がローカル名で、「leetcode.com」がドメイン名となります。
メールアドレスのローカル名の部分のいくつかの文字の間にピリオド ‘.’ を追加すると、そこに送信されたメールはローカル名のドットのない同じアドレスに転送されます。ただし、このルールはドメイン名には適用されません。
- 例えば、”alice.z@leetcode.com “と “alicez@leetcode.com “は同じEメールアドレスに転送されます。
ローカル名にプラス「+」を追加した場合、最初のプラス記号以降はすべて無視されます。これにより、特定の電子メールをフィルタリングすることができます。なお、このルールはドメイン名には適用されません。
- 例えば、”m.y+name@email.com “は “my@email.com “に転送されます。
これらのルールの両方を同時に使用することも可能です。
emails[i]にそれぞれ1通のメールを送る文字列emailsの配列が与えられたとき、実際にメールを受信した異なるアドレスの数を返す。
制約
1 <= emails.length <= 100
1 <= emails[i].length <= 100
emails[i]
は小文字の英字、'+'
、'.'
、'@'
で構成されています。- 各
emails[i]
はちょうど1つの'@'
文字を含んでいます。 - ローカル名とドメイン名はすべて空ではありません。
- ローカル名は
'+'
文字で始まらない。 - ドメイン名は
".com"
接尾辞で終わる。
解説
初めに重複を除外するためHashSetを用意します。
// 重複を削除するためにハッシュセットを用意
var uniqueEmails = new HashSet<string>();
emailsからメールアドレスを一つずつ取り出し、Split("@")
を使用してローカル名とドメイン名を分けます。
次にローカル名にSplit("+")
を使用して分割し、[0]
を指定して+
以降の文字列を削除します。
その後再度ローカル名にReplace(".", "")
を使用し、.
を削除してハッシュセットに追加します。
最後にハッシュセットの数を返して終了です。
foreach (string email in emails)
{
// ローカル名とドメイン名に分ける
var parts = email.Split("@");
var localName = parts[0];
// ローカル名から'+'以降の文字列を削除する
localName = localName.Split("+")[0];
// ローカル名から'.'を削除する
localName = localName.Replace(".", "");
// 変更したローカル名と@とドメイン名をつなげてハッシュセットに追加する
uniqueEmails.Add($"{localName}@{parts[1]}");
}
return uniqueEmails.Count;
ソースコード
public class Solution {
public int NumUniqueEmails(string[] emails)
{
// 重複を削除するためにハッシュセットを用意
var uniqueEmails = new HashSet<string>();
foreach (string email in emails)
{
// ローカル名とドメイン名に分ける
var parts = email.Split("@");
var localName = parts[0];
// ローカル名から'+'以降の文字列を削除する
localName = localName.Split("+")[0];
// ローカル名から'.'を削除する
localName = localName.Replace(".", "");
// 変更したローカル名と@とドメイン名をつなげてハッシュセットに追加する
uniqueEmails.Add($"{localName}@{parts[1]}");
}
return uniqueEmails.Count;
}
}