一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情。
最常见的单词
题目如下图所示,也可以在LeetCode题目中找到此题。
题目解析
这道题看起来字很多,不过还是比较好理解的。
根据题目描述上来看,是想从一个长字符串中,获取一个出现次数最多的单词,并且存在一个禁用单词数组,保证这个结果不是这个禁用数组中的单词即可。
题目提供素材
题目提供了几个素材/参数:
-
一个长字符串,其中包含各种标点符号,以及大小写字母。
-
一个禁用单词数组,在这个数组中的单词不能出现在预期结果中。
注意:长字符串中包含的标点符号有:!?',;.,一定要考虑进去,不要只看例子,我第一次就漏掉了其他标点符号。
具体提示看题目描述。
我的解读
我对这道题目的解读,是有种逐级打怪的感觉。
逐步解决、清理数据,也就是长字符串。
将长字符串转小写,清理标点等等操作,再然后就容易多了。
解题思路
解题思路也和解读差不多。
第一步,先将长字符串全部通过java的toLowerCase方法转为小写。
第二步,使用replace方法将涉及到的标点符号替换成空格。
第三步,根据空格分隔成一个字符串数组,保证数组中每一个元素是一个单独的单词。
第四步,将禁用单词数组转换成一个Map集合,便于获取比对。
第五步,声明一个出现次数Map集合,用于记录每个单词出现的次数。
第六步,循环遍历分隔后的单词数组,并且在循环中判断元素是否是禁用单词,不是的话,存入或更新出现次数Map集合。
第七步,开始对比出现次数Map集合中,哪个单词对应的值最大。也是通过循环Map来一一对比即可,期间记录下最大的值和最大值对应的单词。
第八步,将结果单词返回。
代码
class Solution {
public String mostCommonWord(String paragraph, String[] banned) {
paragraph = paragraph.toLowerCase().replace("'", " ").replace(";", " ").replace(",", " ").replace("!", " ").replace("?", " ").replace(".", " ").replace(" ", " ");
String[] paragraphs = paragraph.split(" ");
Map<String,Integer> bannedMap = new HashMap<>();
for (String b : banned) {
bannedMap.put(b, 1);
}
Map<String,Integer> map = new HashMap<>();
for (String s : paragraphs) {
if (bannedMap.get(s) == null) {
if (map.get(s) != null) {
int num = map.get(s) + 1;
map.put(s, num);
} else {
map.put(s, 1);
}
}
}
String result = "";
Integer resultNum = 0;
for (Map.Entry<String, Integer> entry : map.entrySet()) {
if(entry.getValue() > resultNum){
result = entry.getKey();
resultNum = entry.getValue();
}
}
return result;
}
}
执行结果
本以为会执行的比较慢,后来发现这种方式更快,酷毙了。