算法题:最频繁的单词(原题+解析+知识点整理)

原题:

给定一个段落和一组限定词,返回最频繁的非限定单词。已知至少有一个单词是非限定的,并且答案唯一。
限定词都是以小写字母给出,段落中的单词大小写不敏感。结果请返回小写字母。

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支持
  • 它不保持插入顺序
  • 它不是线程安全的

常用的一些方法:

  1. add()方法可用于将元素添加到一组 。方法声明只有当元素尚未存在于集合中时才会添加元素。如果成功添加了元素,则该方法返回true,否则返回false。
  2. contains方法的目的是检查给定HashSet中是否存在元素。如果找到该元素,则返回true,否则返回false。
  3. clear()可用于从集合中删除所有项目,底层实现只是清除底层HashMap中的所有元素。
  4. size()它有助于识别HashSet中存在的元素数量。底层实现只是将计算委托给HashMap的size()方法。
  5. isEmpty()用来确定HashSet的给定实例是否为空。如果集合不包含任何元素,则此方法返回true:
  6. 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。
HashMapHashSet
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,替换现有数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜狼狼与灰太杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值