LeetCode刷题:两句话中的不常见单词

题目

  1. 两句话中的不常见单词
    给定两个句子 A 和 B 。 (句子是一串由空格分隔的单词。每个单词仅由小写字母组成。)
    如果一个单词在其中一个句子中只出现一次,在另一个句子中却没有出现,那么这个单词就是不常见的。
    返回所有不常用单词的列表。
    您可以按任何顺序返回列表。

题解

这道题其实是找出A+B中出现一次的单词

解法一
想到了Set集合可以去掉重复元素的特点,所以采用Set集合进行。

class Solution {
    List<String> ans=new ArrayList<>();
    public String[] uncommonFromSentences(String A, String B) {
        Set<String> st=new HashSet<>();
        String[] stA=A.split(" ");
        String[] stB=B.split(" ");
        int n=st.size();
        for(String s:stA){
            ans.add(s);
            st.add(s);
            if(n==st.size()){
                ans.remove(s);
                ans.remove(s);
            }
            n=st.size();

        }
        for(String s:stB){
           ans.add(s);
            st.add(s);
            if(n==st.size()){
                ans.remove(s);
                ans.remove(s);
            }
            n=st.size();
        }
        return ans.toArray(new String[ans.size()]);
    }
}

其中,List转数组,采用toArray方法,由于String是引用类型,所以注意要new String[]。

解法二
用Map的键值对,其中,获取某个Key的Value,采用getOrDefault()方法,从而实现在原有的Value上加1。

class Solution {
    List<String> ans=new ArrayList<>();
    public String[] uncommonFromSentences(String A, String B) {
      Map<String, Integer> count = new HashMap();
        for (String word: A.split(" "))
            count.put(word, count.getOrDefault(word, 0) + 1);
        for (String word: B.split(" "))
            count.put(word, count.getOrDefault(word, 0) + 1);

        List<String> ans = new LinkedList();
        for (String word: count.keySet())
            if (count.get(word) == 1)
                ans.add(word);

        return ans.toArray(new String[ans.size()]);
    }
}

你可能感兴趣的:(LeetCode刷题,Java,java,leetcode)