D47 LeetCode 819.最常见的单词(简单)

一、题目

二、思路(自己)

  • 先将paragraph中所有字母小写,然后将单词分开进行存储到treemap中,单词作为键,出现次数作为值,最后再从高到低判断键是否在banned数组中。
    class Solution {
        public String mostCommonWord(String paragraph, String[] banned) {
            String s1=paragraph.toLowerCase();
            String[] s2=s1.split("[!?',;. ]");
            String[] s22=deleteNull(s2);
            Map<String,Integer> m1=new TreeMap<>();
            for(String s3:s22){
                if(m1.containsKey(s3)){
                    m1.put(s3,m1.get(s3)+1);
                    continue;
                }
                m1.put(s3,1);
            }
            Comparator<Map.Entry<String,Integer>> compare=new Comparator<Map.Entry<String, Integer>>() {
                @Override
                public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) {
                    return o2.getValue()-o1.getValue();
                }
            };
            List<Map.Entry<String,Integer>> list=new ArrayList<>(m1.entrySet());
            Collections.sort(list,compare);
    
            List<String> list1=Arrays.asList(banned);
            for(Map.Entry<String,Integer> m2:list){
                if(list1.contains(m2.getKey())) continue;
                else return m2.getKey();
            }
            return "1";
        }
    
        public static String[] deleteNull(String[] s1){
            List<String> list1= Arrays.asList(s1);
            List<String> list2=new ArrayList<>();
            for(String s3:list1){
                if(s3=="") continue;
                list2.add(s3);
            }
            return list2.toArray(new String[list2.size()]);
        }
    }

 

  •  后面的方法deleteNull用于删除生成单词数组中的空白字符,我也不清楚为什么我明明已经把空格分离了还是会有空白字符,于是写了这个方法用来消除。

三、题解(官方)

官方用的不是先分解字符串为单词,而是通过扫描进行计数。

class Solution {
    public String mostCommonWord(String paragraph, String[] banned) {
        Set<String> bannedSet = new HashSet<String>();
        for (String word : banned) {
            bannedSet.add(word);
        }
        int maxFrequency = 0;
        Map<String, Integer> frequencies = new HashMap<String, Integer>();
        StringBuffer sb = new StringBuffer();
        int length = paragraph.length();
        for (int i = 0; i <= length; i++) {
            if (i < length && Character.isLetter(paragraph.charAt(i))) {
                sb.append(Character.toLowerCase(paragraph.charAt(i)));
            } else if (sb.length() > 0) {
                String word = sb.toString();
                if (!bannedSet.contains(word)) {
                    int frequency = frequencies.getOrDefault(word, 0) + 1;
                    frequencies.put(word, frequency);
                    maxFrequency = Math.max(maxFrequency, frequency);
                }
                sb.setLength(0);
            }
        }
        String mostCommon = "";
        Set<Map.Entry<String, Integer>> entries = frequencies.entrySet();
        for (Map.Entry<String, Integer> entry : entries) {
            String word = entry.getKey();
            int frequency = entry.getValue();
            if (frequency == maxFrequency) {
                mostCommon = word;
                break;
            }
        }
        return mostCommon;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值