【力扣第 79 场双周赛】6084. 最多单词数的发件人(中等)

214 阅读1分钟

「本文已参与低调务实优秀中国好青年前端社群的写作活动」

一、题目描述

给你一个聊天记录,共包含 n 条信息。给你两个字符串数组 messages 和 senders ,其中 messages[i] 是 senders[i] 发出的一条 信息 。

一条 信息 是若干用单个空格连接的 单词 ,信息开头和结尾不会有多余空格。发件人的 单词计数 是这个发件人总共发出的 单词数 。注意,一个发件人可能会发出多于一条信息。

请你返回发出单词数 最多 的发件人名字。如果有多个发件人发出最多单词数,请你返回 字典序 最大的名字。

注意:

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

 

示例 1:

输入: messages = ["Hello userTwooo","Hi userThree","Wonderful day Alice","Nice day userThree"], senders = ["Alice","userTwo","userThree","Alice"]
输出: "Alice"
解释: Alice 总共发出了 2 + 3 = 5 个单词。
userTwo 发出了 2 个单词。
userThree 发出了 3 个单词。
由于 Alice 发出单词数最多,所以我们返回 "Alice" 。

示例 2:

输入: messages = ["How is leetcode for everyone","Leetcode is useful for practice"], senders = ["Bob","Charlie"]
输出: "Charlie"
解释: Bob 总共发出了 5 个单词。
Charlie 总共发出了 5 个单词。
由于最多单词数打平,返回字典序最大的名字,也就是 Charlie 。

 

提示:

  • n == messages.length == senders.length
  • 1 <= n <= 104
  • 1 <= messages[i].length <= 100
  • 1 <= senders[i].length <= 10
  • messages[i] 包含大写字母、小写字母和 ' ' 。
  • messages[i] 中所有单词都由 单个空格 隔开。
  • messages[i] 不包含前导和后缀空格。
  • senders[i] 只包含大写英文字母和小写英文字母。

二、思路分析

题目要求返回发出信息中单词数最多的发件人的名字。

怎么统计这个单词数呢
由题意我们可以知道,messages[i] 是 senders[i] 发出的一条信息,该信息是若干用单个空格连接的 单词字符串,因此要看该信息有多少个单词,我们可以根据空格切割字符串,得到的数组的长度就是该信息的单词数量。

如果同个人发了多条信息呢
可以用 Map 存储发件人的单词数,每次遍历 senders 时,如果 map 中有 senders[i] 的单词数,就在此基础上加上 messages[i] 的单词数,否则直接将 键为 senders[i] 、值为 messages[i] 的单词数 存进 map 中。

如果两个人单词数相同呢
这种情况其实好办,直接比大小就完事了。

根据以上三个 Q & A ,我们可以输出结果了
因为要输出最多单词数的发件人,我们定义一个 str 变量,用来记录发件人的名字,以及一个 max 变量,用来存储发件人的最多单词数。每次遍历 senders 时,判断 senders[i] 的单词数是否大于 max ,是的话更新 maxstr ,否则的话判断 senders[i] 的单词数是否等于 max ,这时候需要排字典序,如果 senders[i] 更大的话就更新 max

三、AC 代码

/**
 * @param {string[]} messages
 * @param {string[]} senders
 * @return {string}
 */
var largestWordCount = function(messages, senders) {
    let arr = new Map();
    let max = -Infinity;
    let str = '';
    for (let i = 0; i < senders.length; i++) {
        const n = arr.has(senders[i]) ? arr.get(senders[i]) : 0;
        const m = messages[i].split(' ').length;
        arr.set(senders[i], n + m);
        if (arr.get(senders[i]) > max) {
            max = arr.get(senders[i]);
            str = senders[i];
        } else if (arr.get(senders[i]) === max && str < senders[i]) {
            str = senders[i];
        }
    }
    return str;
};