Conversation
| continue | ||
| } | ||
|
|
||
| simplifiedEmail += string(c) |
There was a problem hiding this comment.
文字列の結合はコストが高く、この場合はbytes.Bufferを使った方が速くなるようです。
var simplifiedEmail bytes.Buffer
// 中略
simplifiedEmail.WriteRune(c)
// 後略Leetcodeで何度か試した感じだと、1/2〜1/3ぐらいになっていそう?たまに0msとかも出るぐらいになりました。
There was a problem hiding this comment.
Go の文字列は imuutable ですね。
https://www.reddit.com/r/golang/comments/1awgp3y/question_immutable_strings/
|
|
||
| func simplifyEmailAddress(email string) string { | ||
| simplifiedEmail := "" | ||
| localOrDomain := "local" |
There was a problem hiding this comment.
localOrDomainは2値で、他にモードが増える事が考えにくい気がしたのでtrue/falseで持ちたい気もしますが、好みによるかもしれません。
There was a problem hiding this comment.
同じことを思いました。定数として表現する場合、Goには言語機能としてenumはないようですが、表現する方法はいくつかあるようなので、そちらを採用するとよりバグフリーなコードになると思います。
https://stackoverflow.com/questions/14426366/what-is-an-idiomatic-way-of-representing-enums-in-go
There was a problem hiding this comment.
ご指摘ありがとうございます。true/falseの場合、例えばisLocal = falseの時にドメインを探索しているということがわかりにくいと思いました。
enumっぽいiotaは使っていこうと思いました
| ``` | ||
|
|
||
| - 標準ライブラリのstringsを使って解く | ||
| - 時間計算量はstep1の解法と同じO(n)のはずなのにこちらの方がleetcodeの計測時間が1/3くらいになるのは標準ライブラリの最適化のおかげ? |
There was a problem hiding this comment.
素朴な文字列結合の繰り返しが高コストと思われます(Step1のコメント参照)
|
|
||
| for _, email := range emails { | ||
| localAndDomain := strings.Split(email, "@") | ||
| if len(localAndDomain) != 2 { |
There was a problem hiding this comment.
この問題では想定されていないんですが、@は複数使えて、
例えば、"very.(),:;<>[]\".VERY.\"very@\\ \"very\".unusual"@strange.example.comは有効なメールアドレスのようです。
ご参考:https://en.wikipedia.org/wiki/Email_address
序でにRFCも貼っておきます。
RFC1034
RFC5322
There was a problem hiding this comment.
こういうのを自分で引っ張って来れるようなマインドセットが大事なんですよね
|
|
||
| func simplifyEmailAddress(email string) string { | ||
| simplifiedEmail := "" | ||
| localOrDomain := "local" |
There was a problem hiding this comment.
同じことを思いました。定数として表現する場合、Goには言語機能としてenumはないようですが、表現する方法はいくつかあるようなので、そちらを採用するとよりバグフリーなコードになると思います。
https://stackoverflow.com/questions/14426366/what-is-an-idiomatic-way-of-representing-enums-in-go
| return distinctSimplifiedEmails | ||
| } | ||
|
|
||
| func simplifyEmailAddress(email string) string { |
There was a problem hiding this comment.
簡素化するというよりは正規化するという方がしっくりきました。normalizeEmailAddressなどはいかがでしょうか。
| } | ||
|
|
||
| local, domain := localAndDomain[0], localAndDomain[1] | ||
| if len(local) == 0 { |
There was a problem hiding this comment.
実務ではemailのvalidationはしっかりテストされたライブラリを見つけるというのも一つの手かと思いました。
There was a problem hiding this comment.
実際の業務でユーザーが入力した値を扱うとなると、どんな値が入ってくるか分からないので(問題には constraints があるとはいえ)別途バリデーションが必要なことは示せていた方が、面接官からは評価されるだろうなと思いました。
面接中に口頭で言ってもいいですし、コードコメントにや Go Doc に書いてしまってもいいかも知れません。
There was a problem hiding this comment.
そうですね。面接の時はおそらく最初から制約は与えてくれないと思うので、自分で聞きながら確認することになるだろうと思います
| localName = strings.Split(localName, "+")[0] | ||
| localName = strings.ReplaceAll(localName, ".", "") | ||
|
|
||
| normalized := localName + "@" + domainName |
There was a problem hiding this comment.
Eメールの正規化部分は関数化されていると読みやすいです。
これは好みですが、自分は正規化処理自体も個々の操作の関数の組み合わせで書かれているとわかりやすいと思います。
https://leetcode.com/problems/unique-email-addresses/description/