第 178 場力扣周賽 第二題

zyfsuzy發表於2020-03-01

題目

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

排名規則如下:

參賽團隊的排名次序依照其所獲「排位第一」的票的多少決定。如果存在多個團隊並列的情況,將繼續考慮其「排位第二」的票的數量。以此類推,直到不再存在並列的情況。
如果在考慮完所有投票情況後仍然出現並列現象,則根據團隊字母的字母順序進行排名。
給你一個字串陣列 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 隊參賽,所以它排名第一。

class Solution {

    /**
     * @param String[] $votes
     * @return String
     */
    function rankTeams($votes) {
        if(strlen($votes[0]) == 1) return $votes[0]; 
        //所有參賽隊伍
        $team = str_split($votes[0]);
        $voteCount = array();
        //初始化
        foreach ($team as $key => $value) {
            $voteCount[$value] = array();
            for ($i=0; $i < count($team); $i++) { 
                $voteCount[$value][$i+1] = 0;
            }
        }
        //得到投票結果
        for ($i=0; $i < count($votes); $i++) { 
            //每一個人的投票結果
            $str = $votes[$i];
            for ($j=0; $j <strlen($str); $j++) {
                $voteCount[$str[$j]][$j+1]++;
            }
        }

        ksort($voteCount);
        uasort($voteCount, array($this, 'cmp'));
        $result = implode('', array_keys($voteCount));
        return $result;
    }
    //自定義排序演算法
    function cmp($a, $b){
        for ($i=1; $i <= count($a); $i++) { 
            if($a[$i] > $b[$i]) return -1;
            if($a[$i] == $b[$i]) continue;
            if($a[$i] < $b[$i]) return 1;
        }
    }
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章