「本文已参与低调务实优秀中国好青年前端社群的写作活动」
一、题目描述
给你一个聊天记录,共包含 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.length1 <= n <= 1041 <= messages[i].length <= 1001 <= senders[i].length <= 10messages[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 ,是的话更新 max 和 str ,否则的话判断 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;
};