题目表述
句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。 如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现
,那么这个单词就是 不常见的 。 给你两个 句子 s1 和 s2 ,返回所有 不常用单词 的列表。返回列表中单词可以按 任意顺序 组织。
输入:s1 = “this apple is sweet”, s2 = “this apple is sour”
输出:[“sweet”,“sour”]
输入:s1 = “apple apple”, s2 = “banana”
输出:[“banana”]
思路
两句话中不常见的字符串,就是求两句话中一次出现的字符串。 首先将输入的字符串中的单词切分出,利用 HashMap 键值对容器,将单词存储在
key中,value 存储 当前 key 出现的次数,次数为 1 的将加入 list集合转化成数组
代码
方法一
class Solution {
public String[] uncommonFromSentences(String s1, String s2) {
HashMap<String,Integer> wordFreq = new HashMap<String,Integer>();
insertMap(s1,wordFreq);
insertMap(s2,wordFreq);
ArrayList<String> list = new ArrayList<String>();
for (HashMap.Entry<String,Integer> map : wordFreq.entrySet()){
if(map.getValue() == 1){
list.add(map.getKey());
}
}
return list.toArray(new String[0]);
}
public void insertMap(String s , HashMap<String,Integer> map){
String[] str = s.split(" ");
for(String word : str){
map.put(word,map.getOrDefault(word,0) + 1);
}
}
}
- 思考
在编写算法的时,需要灵活运用 java相关的 API接口方法,如map.getOrDefault(word,0) + 1
如果使用的时get
会报一个NullPointerException
空指针异常,原因 map集合在初始化时 values 初始化为 null,还有就是要注意在遍历键值对对象,需要调用Entry<String,Integer>
接口和键值对集合,从而实现键值对的遍历。
方法二
// 核心代码
HashSet<String> set = new HashSet<>();
ArrayList<String> list = new ArrayList<>();
s1 = s1 +" " + s2;
String[] arr = s1.split(" ");
for (String word : arr){
if (set.contains(word)){
list.add(word);
}else {
set.add(word);
}
}
for (String word : list){
set.remove(word);
}
return set.toArray(new String[0]);
- 思考
利用了HashSet
自带的去重功能。首先将两句话进行拼接再切分成数组,set 集合包含字符串就说明是重复的,将其保存到list
里面,不包含就加入 set,最终,list 中全是重复的,set 中去除 list 中即是单次出现的字符串。这种方法用时较大,原因就在于操作set
集合,它本身需要判断重复的字符串。