原题:
给定一个段落和一组限定词,返回最频繁的非限定单词。已知至少有一个单词是非限定的,并且答案唯一。
限定词都是以小写字母给出,段落中的单词大小写不敏感。结果请返回小写字母。
1 <= paragraph.length <= 1000.
1 <= banned.length <= 100.
1 <= banned[i].length <= 10.
答案唯一,并且返回小写(即使以大写字母出现在段落中就,或是一个专有名词.)
段落仅由字母、空格、标点!?’,;.组成。
不同的单词会被空格隔开.
没有连字符或者连字单词.
单词仅由小写字母组成,没有所有格或别的标点符号。
样例1:
输入: paragraph = “Bob hit a ball, the hit BALL flew far after it was
hit.” 和 banned = [“hit”] 输出: “ball” 解释: “hit” 出现3次但是限定词。 “ball”
出现两次,是最频繁的非限定词。 注意段落中大小写不敏感。 标点符号请忽略 (即使紧挨单词,例如"ball,"),
样例2:
输入: paragraph = “a a a b b c c d” 和 banned = [“a”,“b”] 输出: “c” 解释:
"a"和"b"都是限定词 “c"出现了2次,而"d"只出现过一次 所以输出"c”
、
我的解答
public class Solution {
/**
* @param paragraph:
* @param banned:
* @return: nothing
*/
public String mostCommonWord(String paragraph, String[] banned) {
// 将paragraph字符串全部转化为小写,传值给数组str
String str = paragraph.toLowerCase();
// 将str以" "分割为字符串数组传值给array
String[] array = str.split(" ");
Map<String, Integer> map = new HashMap<>();
//将限制词传值给set集合
Set<String> set = new HashSet<>();
for (String item : banned) {
set.add(item);
}
//初始化结果返回字符串res
String res = "";
for (int i = 0; i < array.length; i++) {
String item = array[i];
//item最后一个字符存储到c
char c = item.charAt(item.length() - 1);
//判断c是否为字母
if (!Character.isLetter(c)) {
//去字符串的标点符号
item = array[i].substring(0, array[i].length() - 1);
}
//因为item存在相同,用put会替换对应的value,所以此处用putIfAbsent()方法
map.putIfAbsent(item, 0);
//此时map.value为item字符串出现的次数
map.put(item, map.get(item) + 1);
}
int max = 0;
//遍历map中的key,
for (String key : map.keySet()) {
if (set.contains(key)) {
continue;
}
if (map.get(key) > max) {
max = map.get(key);
res = key;
}
}
return res;
}
}
代码已经给出我的解题思路,下方是我关于一些知识点的整理
- HashMap
- HashSet
- HashMap&HashSet区别
- Java 部分方法【charAt()、isLetter()、subString()】
- HashMap中put与putIfAbsent的区别
HashMap
HashMap类实现了Map接口,所以实现了Map常用的一些方法
(1) 插入键值对数据
public V put(K key, V value)
(2)根据键值获取键值对值数据
public V get(Object key)
(3)获取Map中键值对的个数
public int size()
(4)判断Map集合中是否包含键为key的键值对
public boolean containsKey(Object key)
(5)判断Map集合中是否包含值为value的键值对
boolean containsValue(Object value)
(6)判断Map集合中是否没有任何键值对
public boolean isEmpty()
(7)清空Map集合中所有的键值对
public void clear()
(8)根据键值删除Map中键值对
public V remove(Object key)
HashSet
HashSet是Java Collections API中的基本数据结构之一。
- 它存储唯一元素并允许空值
- 它由HashMap支持
- 它不保持插入顺序
- 它不是线程安全的
常用的一些方法:
- add()方法可用于将元素添加到一组 。方法声明只有当元素尚未存在于集合中时才会添加元素。如果成功添加了元素,则该方法返回true,否则返回false。
- contains方法的目的是检查给定HashSet中是否存在元素。如果找到该元素,则返回true,否则返回false。
- clear()可用于从集合中删除所有项目,底层实现只是清除底层HashMap中的所有元素。
- size()它有助于识别HashSet中存在的元素数量。底层实现只是将计算委托给HashMap的size()方法。
- isEmpty()用来确定HashSet的给定实例是否为空。如果集合不包含任何元素,则此方法返回true:
- Iterator()方法返回Set中元素的迭代器。
HashSet&HashMap
- HashSet实现了Set接口,它不允许集合中有重复的值,当我们提到HashSet时,第一件事情就是在将对象存储在HashSet之前,要先确保对象重写equals()和hashCode()方法,这样才能比较对象的值是否相等,以确保set中没有储存相等的对象。如果我们没有重写这两个方法,将会使用这个方法的默认实现。
- HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许重复的键。Map接口有两个基本的实现,HashMap和TreeMap。TreeMap保存了对象的排列次序,而HashMap则不能。HashMap允许键和值为null。HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized,这样多个线程同时访问HashMap时,能保证只有一个线程更改Map。
HashMap | HashSet |
---|---|
HashMap实现了Map接口 | HashSet实现了Set接口 |
HashMap储存键值对 | HashSet仅仅存储对象 |
使用put()方法将元素放入map中 | 使用add()方法将元素放入set中 |
HashMap中使用键对象来计算hashcode值 | HashSet使用成员对象来计算hashcode值, |
对于两个对象来说hashcode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false | <– |
HashMap比较快,因为是使用唯一的键来获取对象 | HashSet较HashMap来说比较慢 |
Java 方法
1.charAt()
charAt() 方法用于返回指定索引处的字符。索引范围为从 0 到 length() - 1。
public char charAt(int index)
2.isLetter()
isLetter() 方法用于判断指定字符是否为字母。
boolean isLetter(char ch)
3.substring()
substring() 方法返回字符串的子字符串。
-
beginIndex – 起始索引(包括), 索引从 0 开始。
-
endIndex – 结束索引(不包括)
//去掉最后一个字符串
substring(0, array[i].length() - 1);
HashMap中put方法和putIfAbsent方法区别
put方法
- HashMap中的put方式是将key和value放入Map队列中.如果key值已存在,则替换对应的value.
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
- putIfAbsent方法与put方法的不同点是:如果key值已存在,则不替换对应的value.
public V putIfAbsent(K key, V value) {
return putVal(hash(key), key, value, true, true);
}
这两个方法的区别调用putVal方法的第三个参数true,表示如果存在不替换现有数据,如果false,替换现有数据。