LintCode 1883 · 前K个高频关键词

162阅读模式

给定一个评论列表reviews,一个关键字列表 keywords 以及一个整数k。
找出在不同评论中出现次数最多的前k个关键词,这k个关键词按照出现次数的由多到少来排序。
字符串不区分大小写,如果关键字在不同评论中出现的次数相等,请按字母顺序从小到大排序文章源自懂站帝-http://www.sfdkj.com/13934.html

思路

构建数组arr[lkeywords.length],每位对应关键字出现的次数。遍历reviews列表,填充arr的值,再取出前K个即可。文章源自懂站帝-http://www.sfdkj.com/13934.html

public List<String> topkKeywords(int k, String[] keywords, String[] reviews) {

        //构建数组
        int[] arr = new int[keywords.length];

        for(String review: reviews){
            //评论小写,并按照关键字切成数组
            String[] words = review.toLowerCase().split("[,;?'\\.\\!\\\\ \\[\\]]");
            for(int i = 0 ; i < keywords.length ;i++){
                for(int j = 0 ; j < words.length;j++){
                    //填充arr数据
                    if(keywords[i].equals(words[j].trim())){
                        arr[i]++;
                        break;
                    }
                }
            }
        }

        int[] res = new int[k];
        for(int i = 0 ; i <k;i++){
            int postion = -1;
            int max = -1;
            for(int j = 0 ; j< arr.length ;j++){
                if(arr[j] > max){
                    max = arr[j];
                    postion =j;
                }else if (arr[j] == max){
                    if(keywords[j].compareTo(keywords[postion])<0){
                        max = arr[j];
                        postion =j;
                    }
                }
            }
            res[i] = postion;
            if(postion >= 0){
                arr[postion] = -2;
            }
        }

        List<String> result = new ArrayList();
        for(int i =0 ; i < k ;i++){
            if(res[i] >=0){
                result.add(keywords[res[i]]);
            }
        }
        return result;
    }
文章源自懂站帝-http://www.sfdkj.com/13934.html
懂站帝
  • 本文由 发表于 2022年6月9日 00:25:59
  • 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至395045033@qq.com举报,一经查实,本站将立刻删除。