LeetCode884. 两句话中的不常见单词

LeetCode884. 两句话中的不常见单词

题目表述

句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。 如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现
,那么这个单词就是 不常见的 。 给你两个 句子 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);
        }
    }
}

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]);

2

  • 思考
    利用了HashSet自带的去重功能。首先将两句话进行拼接再切分成数组,set 集合包含字符串就说明是重复的,将其保存到list里面,不包含就加入 set,最终,list 中全是重复的,set 中去除 list 中即是单次出现的字符串。这种方法用时较大,原因就在于操作set集合,它本身需要判断重复的字符串。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值