「这是我参与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%的用户