刷题的日常-最多单词数的发件人

126 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第13天,点击查看活动详情

刷题的日常

一天一题,保持脑子清爽

最多单词数的发件人

来自leetcode的 2284 题,题意如下:

给你一个聊天记录,共包含 n条信息。给你两个字符串数组messages 和senders,其中messages[i]是senders[i]发出的一条信息。
一条 信息是若干用单个空格连接的 单词,信息开头和结尾不会有多余空格。发件人的 单词计数是这个发件人总共发出的 单词数。注意,一个发件人可能会发出多于一条信息。
请你返回发出单词数 最多的发件人名字。如果有多个发件人发出最多单词数,请你返回 字典序最大的名字。
注意:

  • 字典序里,大写字母小于小写字母。
  • "Alice" 和"alice"是不同的名字。

理解题意

我们可以从题意中提取的条件如下:

  • 题目会给定两个数组
    • 一个是发件人数组
    • 一个是发件信息
  • 要统计每个发件人发送的信息的单词数量
  • 要返回发送单词数最多的发件人
  • 如果单词数量相同,则返回字典序最大的一个

做题思路

需要注意的是,相同的单词可以被统计多次,所以我们直接根据空格切分出单词就可以了。

  • 遍历所有的消息,用Map存储发件人发送的单词数量
  • 通过对空格进行统计,我们可以知道一个消息中的单词为 空格数 + 1
  • 在遍历的过程中统计结果,遇到最大的进行保存,如果最大值相同,则保留字典序最大的一个数
  • 返回结果

代码实现

代码实现如下:

public class Solution {
    public String largestWordCount(String[] messages, String[] senders) {
        Map<String, Integer> map = new HashMap<>();
        int tmp, max = 0;
        String result = null, sender;
        for (int i = 0; i < messages.length; i++) {
            sender = senders[i];
            tmp = map.computeIfAbsent(sender, (k) -> 0);
            map.put(sender, tmp += countWord(messages[i]));
            if (max < tmp) {
                max = tmp;
                result = sender;
                continue;
            }
            if (max > tmp) {
                continue;
            }
            if (sender.compareTo(result) <= 0) {
                continue;
            }
            max = tmp;
            result = sender;
        }
        return result;
    }
    private int countWord(String message) {
        int result = 0;
        for (int i = 0; i < message.length(); i++) {
            if (message.charAt(i) == ' ') {
                result++;
            }
        }
        return result + 1;
    }
}