【筆質問日記】最も一般的な言葉

一緒に書く習慣を身につけましょう!「ナゲッツデイリーニュープラン・4月アップデートチャレンジ」に参加して16日目です。クリックしてイベントの詳細をご覧ください

【筆質問日記】最も一般的な言葉

この執筆日記の36番目の記事、タイトルは次のとおりです:最も一般的な単語シンプル

1.トピックの説明:

最も一般的な単語のトピック一見すると、広大な辞書で特定の範囲内の頻度の単語を探していると思いました。よく見ると、それほど複雑ではないように見えますが、それでも非常に単純に見えます。わかりやすいです。

2.この質問はどのような考えを検討しますか?あなたはどう思いますか?

トピックが私たちに教えてくれる重要な情報を見てみましょう。

  • タイトルは段落を示します。この段落には複数の単語が含まれる場合があります。または1つの単語が含まれる場合があります。単語には大文字と小文字が含まれます。
  • タイトルには、小文字の禁止単語のリストも記載されています。上記の段落で最も頻繁に出現する単語と、禁止リストにない単語を見つける必要があります。ここでは、比較に注意を払う必要があります。および検証。元の大文字を小文字に変換します。

質問の意味は非常に明確です。単語の頻度を計算するトピックを見ると、実際には条件付き反射がある可能性があります。この種のトピックは、ハッシュテーブルを使用する可能性が高いです。

注意深く分析した後、2つのことを行う必要があります。

  • 各単語を明示的に見つけて、各単語が出現する頻度を数えます

単語を見つけるのが簡単です。段落文字列をトラバースするときに、一時的なスライスを使用してトラバースされた文字を格納できます。現在の文字がスペースまたはその他の文字以外の文字であることを確認すると、一時的な数字はスライス、すでに完全な単語

単語の出現頻度を計算し、上記で見つかった単語をハッシュテーブルに入れて、その数を記録します

  • 出現回数が最も多い単語を見つける方法、まだ無効にすることはできません

通过上述的遍历,和哈希表的处理,我们就可以用一个变量来存储出现频次最大的数字,后续遍历 哈希表的时候,就可以拿出来进行比对,找到对应的字符串,我们就可以实现这个题的要求了

上述思路还是比较清晰的,虽然没有图,但是文字已经能够简单的表达出思路了,接下来就开始撸代码吧

三、编码

根据上述逻辑和分析,我们就可以翻译成如下代码,此处的编码需要注意的是,咱们遍历段落循环的控制,我们可以根据判断当前字符不是字母的情况下,来校验当前是否已经找到一个单词

但是,我们需要注意的是,如果段落中,只有一个单词的时候,我们需要处理好这种场景

例如,我们可以遍历的时候,控制可以让索引等于段落字符串的长度,具体带编码细节

func mostCommonWord(paragraph string, banned []string) string {
    // 记录 banded 的字符
    bm := map[string]bool{}
    for _, b := range banned {
        bm[b] = true
    }
    // 记录段落的长度
    length := len(paragraph)
    // 定义记录单词评率的 map
    helper := map[string]int{}
    var tmp []byte
    var maxFreq int
    // 此处控制的循环就可以是 等于 length 的, 原因是,当给出的段落中就只有一个单词的时候,我们也是要进行处理的
    for i:=0; i<=length; i++ {
        // 判断如果是字母,则咱们继续将该字母加入到 tmp 切片中
        if  i<length && unicode.IsLetter(rune(paragraph[i])){
            tmp = append(tmp,byte(unicode.ToLower(rune(paragraph[i]))))
        }else if tmp != nil{
            // 不是字母的时候,说明这个时候已经是空格了,那么 tmp 已经是一个单词了,此时就要处理改单词出现频率的事情了
            // 还需要查看该字符串是否被禁用了
            s := string(tmp)
            if !bm[s]{
                helper[s]++
                maxFreq = max(maxFreq,helper[s])
            }
            tmp = nil
        }
    }

    for s,v := range helper{
        if maxFreq == v{
            return s
        }
    }
    return ""
}
// 写一个比较数字的函数
func max(a,b int) int {
    if a>b {
        return a
    }
    return b
}
复制代码

咱们编码的思路可以理解是这样的

  • 先将被禁用的单词,用一个 map 来记录一波
  • 遍历段落字符串,计算出对应单词出现的频率,存放到 helper 哈希表中,和记录最大频率的数值
  • 遍历 helper 哈希表,判断未被禁用的字符串出现的频率是否等于目前记录的最大频率,若是,则返回该字符串

四、总结:

这种实现方式的时间复杂度是多少呢,我们可以看到,题目中的实现,我们要是对于给出的禁用列表做了一次遍历,对于题目给出的段落字符串进行了一次遍历,那么咱们的时间复杂是 O(m+n)

スペースの複雑さも同じです。2つのマップを導入したため、スペースが消費され、スペースの複雑さもO(m + n)、mは無効リストの長さ、nは段落文字列の長さを表します。

元のタイトルアドレス:819。最も一般的な単語

私は今日ここにいます、私が学んだこと、何か逸脱があれば、私を訂正してください

いいね、フォロー、お気に入りへようこそ

友達、あなたのサポートと励ましは、私が共有を続け、品質を向上させる動機です

さて、これが今回です

テクノロジーはオープンであり、私たちの精神はオープンでなければなりません。変化を受け入れ、太陽の下で生き、前進します。

私は小悪魔の少年哪吾です、好きで、フォローして集めて、また会いましょう〜

おすすめ

転載: juejin.im/post/7087944076183470087