开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情
通过投票对团队排名
现在有一个特殊的排名系统,依据参赛团队在投票人心中的次序进行排名,每个投票者都需要按从高到低的顺序对参与排名的所有团队进行排位。
排名规则如下:
参赛团队的排名次序依照其所获「排位第一」的票的多少决定。如果存在多个团队并列的情况,将继续考虑其「排位第二」的票的数量。以此类推,直到不再存在并列的情况。 如果在考虑完所有投票情况后仍然出现并列现象,则根据团队字母的字母顺序进行排名。 给你一个字符串数组 votes 代表全体投票者给出的排位情况,请你根据上述排名规则对所有参赛团队进行排名。
请你返回能表示按排名系统 排序后 的所有团队排名的字符串。
示例1:
输入:votes = ["ABC","ACB","ABC","ACB","ACB"]
输出:"ACB"
解释:A 队获得五票「排位第一」,没有其他队获得「排位第一」,所以 A 队排名第一。
B 队获得两票「排位第二」,三票「排位第三」。
C 队获得三票「排位第二」,两票「排位第三」。
由于 C 队「排位第二」的票数较多,所以 C 队排第二,B 队排第三。
示例2:
输入:votes = ["WXYZ","XYZW"]
输出:"XWYZ"
解释:X 队在并列僵局打破后成为排名第一的团队。X 队和 W 队的「排位第一」票数一样,但是 X 队有一票「排位第二」,而 W 没有获得「排位第二」。
示例3:
输入:votes = ["ZMNAGUEDSJYLBOPHRQICWFXTVK"]
输出:"ZMNAGUEDSJYLBOPHRQICWFXTVK"
解释:只有一个投票者,所以排名完全按照他的意愿。
示例4:
输入:votes = ["BCA","CAB","CBA","ABC","ACB","BAC"]
输出:"ABC"
解释:
A 队获得两票「排位第一」,两票「排位第二」,两票「排位第三」。
B 队获得两票「排位第一」,两票「排位第二」,两票「排位第三」。
C 队获得两票「排位第一」,两票「排位第二」,两票「排位第三」。
完全并列,所以我们需要按照字母升序排名。
示例5:
输入: votes = ["M","M","M","M"]
输出: "M"
解释: 只有 M 队参赛,所以它排名第一。
提示:
- 1 <= votes.length <= 1000
- 1 <= votes[i].length <= 26
- votes[i].length == votes[j].length for 0 <= i, j < votes.length
- votes[i][j] 是英文 大写 字母
- votes[i] 中的所有字母都是唯一的
- votes[0] 中出现的所有字母 同样也 出现在 votes[j] 中,其中 1 <= j < votes.length
解题思路:
将每个队的排在个名次的的数量转化为权重分,比如第一名权重是第二名的权重的26倍,依次类推
我的答案:
/**
* @param {string[]} votes
* @return {string}
*/
var rankTeams = function(votes) {
//添加权重,计算每个队员的权重分,然后进行排序即可。
let chars='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
let rank=new Array(26).fill(0);
let len=votes[0].length;//对len个队员来进行排名
for(let i=0;i<len;i++){
for(let j=0;j<votes.length;j++){
//第j个人投票给 队员votes[j][i] 名次为i 转化为权重分,累加起来
rank[ chars.indexOf(votes[j][i]) ] += Math.pow(26,len-1-i);
}
}
//console.log(rank);
let res=[];
for(let i=0;i<26;i++){
if(rank[i]>0)res.push(chars[i]);
}
res.sort((a,b)=>{
return rank[chars.indexOf(b)]-rank[chars.indexOf(a)];
})
return res.join("");
};
最后
如果有更好的解法或者思路, 欢迎在评论区和我交流~ ღ( ´・ᴗ・` )