力扣:16.02. 单词频率

226 阅读2分钟

「这是我参与11月更文挑战的第21天,活动详情查看:2021最后一次更文挑战

描述

设计一个方法,找出任意指定单词在一本书中的出现频率。

你的实现应该支持如下操作:

WordsFrequency(book)构造函数,参数为字符串数组构成的一本书 get(word)查询指定单词在书中出现的频率

  • 示例 1:
WordsFrequency wordsFrequency = new WordsFrequency({"i", "have", "an", "apple", "he", "have", "a", "pen"});
wordsFrequency.get("you"); //返回0,"you"没有出现过
wordsFrequency.get("have"); //返回2,"have"出现2次
wordsFrequency.get("an"); //返回1
wordsFrequency.get("apple"); //返回1
wordsFrequency.get("pen"); //返回1
  • 提示:
  • book[i]中只包含小写字母
  • 1 <= book.length <= 100000
  • 1 <= book[i].length <= 10
  • get函数的调用次数不会超过100000

解析

感觉本题不像中度难度的题,解法也是比较简单的,这里我采用了哈希表的想法,在构造函数中就先记录所有单词出现的次数,然后get()方法调用的时候就可以直接获得数据啦,而不需要在get()方法中再去计数。

具体做法就是先统计给定字符串数组中的每个字符串出现的次数,再判断给定字符串在字符串数组中的出现次数; 所以我们可以在在MapReduce中就是采用k-v的方式对单词进行统计,此方法虽然在执行时耗时较长,但是可以做到一次写入多次读取,即使在面临大量数据的book字符串组时依然具有很大优势。

class WordsFrequency {
    // 创建HashMap用于存放统计单词的结果
    HashMap<String,Integer> map;
    public WordsFrequency(String[] book) {
        // 在构造方法中给出HashMap的定义,将单词与出现次数存放到map中
        map=new HashMap<>();
        for (String s : book) {
            if(map.containsKey(s)){
                map.put(s,map.get(s)+1);
            }else{
                map.put(s,1);
            }
        }
    }
    // get方法调用了HashMap的get方法,但是要注意查询单词不存在的情况
    public int get(String word) {
        if(map.containsKey(word)){
        return map.get(word);            
        }
        return 0;
    }
}
​
/**
 * Your WordsFrequency object will be instantiated and called as such:
 * WordsFrequency obj = new WordsFrequency(book);
 * int param_1 = obj.get(word);
 */

运行结果:

执行结果:通过

执行用时:137 ms, 在所有 Java 提交中击败了55.19%的用户

内存消耗:87.8 MB, 在所有 Java 提交中击败了20.27%的用户