1. 程式人生 > 實用技巧 >LeetCode 1366. 通過投票對團隊排名 雜湊排序

LeetCode 1366. 通過投票對團隊排名 雜湊排序

地址https://leetcode-cn.com/problems/rank-teams-by-votes/

現在有一個特殊的排名系統,依據參賽團隊在投票人心中的次序進行排名,每個投票者都需要按從高到低的順序對參與排名的所有團隊進行排位。

排名規則如下:

參賽團隊的排名次序依照其所獲「排位第一」的票的多少決定。如果存在多個團隊並列的情況,將繼續考慮其「排位第二」的票的數量。以此類推,直到不再存在並列的情況。
如果在考慮完所有投票情況後仍然出現並列現象,則根據團隊字母的字母順序進行排名。
給你一個字串陣列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 for0 <= i, j < votes.length votes[i][j]是英文 大寫 字母 votes[i]中的所有字母都是唯一的 votes[0]中出現的所有字母 同樣也 出現在votes[j]中,其中1 <= j < votes.length

演算法1
題目有點長 主要是建立一個結構體 對每隊在1-26名獲得投票做記錄
然後進行排序(投票可能有1000的範圍,但是可投票的隊伍最多26個,可排的名次最多也就26個)

class Solution {
public:
    struct Node{
        char c;
        int rank[26];
    };
    struct Node vv[26];
    
    void InsertRank(string s){
        for(int i = 0;i < s.size();i++){
            int idx = s[i]-'A';
            vv[idx].c = s[i];
            vv[idx].rank[i]++;
        }
    }
    
    static bool cmp(const  struct Node& a,const  struct Node& b){
        for(int i = 0; i < 26;i++){
            if(a.rank[i] > b.rank[i] ) return true;
            if(a.rank[i] < b.rank[i])  return false;
        }
        
        return a.c < b.c;
    }
    
    string rankTeams(vector<string>& votes) {
        if(votes.empty()) return "";
        if(votes.size()==1) return votes[0];
        
        memset(vv,0,sizeof(struct Node)*26);
        
        for(int i = 0; i < votes.size();i++){
            InsertRank(votes[i]);
        }
        
        sort(vv,vv+26,cmp);
        string ans;
        for(int i = 0; i< votes[0].size();i++){
            ans += vv[i].c;
        }
        
        return ans;
    }
};