持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情
🎈算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 -> 最流行的视频创作者
题目描述
给你两个字符串数组 creators 和 ids ,和一个整数数组 views ,所有数组的长度都是 n 。平台上第 i 个视频者是 creator[i] ,视频分配的 id 是 ids[i] ,且播放量为 views[i] 。
视频创作者的 流行度 是该创作者的 所有 视频的播放量的 总和 。请找出流行度 最高 创作者以及该创作者播放量 最大 的视频的 id 。
- 如果存在多个创作者流行度都最高,则需要找出所有符合条件的创作者。
- 如果某个创作者存在多个播放量最高的视频,则只需要找出字典序最小的
id。
返回一个二维字符串数组 **answer **,其中 **answer[i] = [creatori, idi] **表示 **creatori 的流行度 最高 且其最流行的视频 id 是 **idi **,可以按任何顺序返回该结果 。
示例 1:
输入: creators = ["alice","bob","alice","chris"], ids = ["one","two","three","four"], views = [5,10,5,4]
输出: [["alice","one"],["bob","two"]]
解释:
alice 的流行度是 5 + 5 = 10 。
bob 的流行度是 10 。
chris 的流行度是 4 。
alice 和 bob 是流行度最高的创作者。
bob 播放量最高的视频 id 为 "two" 。
alice 播放量最高的视频 id 是 "one" 和 "three" 。由于 "one" 的字典序比 "three" 更小,所以结果中返回的 id 是 "one" 。
示例 2:
输入: creators = ["alice","alice","alice"], ids = ["a","b","c"], views = [1,2,2]
输出: [["alice","b"]]
解释:
id 为 "b" 和 "c" 的视频都满足播放量最高的条件。
由于 "b" 的字典序比 "c" 更小,所以结果中返回的 id 是 "b" 。
提示:
n == creators.length == ids.length == views.length1 <= n <= 1051 <= creators[i].length, ids[i].length <= 5creators[i]和ids[i]仅由小写英文字母组成0 <= views[i] <= 105
思路分析
首先我们要先理解一下题目的意思,题目会我们一个数组 两个字符串数组 creators 和 ids ,和一个整数数组 views,所有数组的长度都是 n 。平台上第 i 个视频者是 creator[i] ,视频分配的 id 是 ids[i] ,且播放量为 views[i] 。
我们需要在给出的信息中找出流行度 最高 创作者以及该创作者播放量 最大 的视频的 id,其中视频创作者的 流行度 是该创作者的 所有 视频的播放量的 总和。
- 如果存在多个创作者流行度都最高,则需要找出所有符合条件的创作者。
- 如果某个创作者存在多个播放量最高的视频,则只需要找出字典序最小的
id。
所以我们可以先统计每个作者的流行度,并记录其播放量最大的视频id,统计的过程中可以先记录下流行度最高的数值,统计完之后便可以在统计完的数据中找出流行度最高的数值。
- 1、统计每个作者的流行度
以作者名称为key,统计每个作者的流行度,并记录下每个作者播放量最高的视频id;max为最高流行度的数值。
let map = {},max = 0;
for(let i = 0; i < creators.length; i++){
if(map[creators[i]]){
if(map[creators[i]].id > ids[i]){
map[creators[i]].id = ids[i];
}
map[creators[i]].views = map[creators[i]].views + views[i];
if(map[creators[i]].max < views[i] || (map[creators[i]].max == views[i] && map[creators[i]].maxid > ids[i])){
map[creators[i]].max = views[i];
map[creators[i]].maxid = ids[i];
}
max = Math.max(max,map[creators[i]].views);
}else{
map[creators[i]] = {};
map[creators[i]].id = ids[i];
map[creators[i]].views = views[i];
map[creators[i]].max = views[i];
map[creators[i]].maxid = ids[i];
max = Math.max(max,views[i]);
}
}
- 2、找出流行度最高的作者
在作者统计数据中找到与统计后记录的流行度最高数值相等的作者信息数据。
const res = [];
for(let key in map){
if(map[key].views == max){
res.push([key,map[key].maxid]);
}
}
return res;
完整AC代码如下:
AC代码
/**
* @param {string[]} creators
* @param {string[]} ids
* @param {number[]} views
* @return {string[][]}
*/
var mostPopularCreator = function(creators, ids, views) {
let map = {},max = 0;
for(let i = 0; i < creators.length; i++){
if(map[creators[i]]){
if(map[creators[i]].id > ids[i]){
map[creators[i]].id = ids[i];
}
map[creators[i]].views = map[creators[i]].views + views[i];
if(map[creators[i]].max < views[i] || (map[creators[i]].max == views[i] && map[creators[i]].maxid > ids[i])){
map[creators[i]].max = views[i];
map[creators[i]].maxid = ids[i];
}
max = Math.max(max,map[creators[i]].views);
}else{
map[creators[i]] = {};
map[creators[i]].id = ids[i];
map[creators[i]].views = views[i];
map[creators[i]].max = views[i];
map[creators[i]].maxid = ids[i];
max = Math.max(max,views[i]);
}
}
const res = [];
for(let key in map){
if(map[key].views == max){
res.push([key,map[key].maxid]);
}
}
return res;
};
说在后面
🎉这里是JYeontu,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。