Leetcode 1366. Rank Teams by Votes
题目链接: Rank Teams by Votes
难度:Medium
题目大意:
大写字母代表队伍的名字,输入一些字符串,表示投票情况,获得第一选票较多的队伍获胜,如果第一选票相等则比较第二选票,以此类推,如果都相等,则按字母顺序排列。将所有队伍按投票情况进行排列,返回排序后的结果。
思路:
统计每个队伍获得各个位次选票的情况,然后按照题目要求的优先级进行排序。
代码
方法1: 用数组统计队伍的投票情况
class Solution {public String rankTeams(String[] votes) {int n=votes[0].length();char[] temp=votes[0].toCharArray();Character[] team=new Character[temp.length];for(int i=0;i<temp.length;i++){team[i]=temp[i];}//char数组转Character数组int[][] rank=new int[26][n];for(int i=0;i<votes.length;i++){for(int j=0;j<n;j++){char c=votes[i].charAt(j);int k=c-'A';rank[k][j]++;}}//rank[1][0]表示字母B获得第一的票数Arrays.sort(team,new Comparator<Character>(){public int compare(Character c1,Character c2){int j=0;while(j<n&&rank[c1-'A'][j]==rank[c2-'A'][j]){j++;}if(j==n){return c1-c2;}else{return rank[c2-'A'][j]-rank[c1-'A'][j];}}});for(int i=0;i<n;i++){temp[i]=team[i];}//Character数组转charreturn new String(temp);}
}
方法2: 用HashMap统计队伍的投票情况
class Solution {public String rankTeams(String[] votes) {int n=votes[0].length();Map<Character,int[]> map=new HashMap<>();for(String s:votes){for(int i=0;i<n;i++){char c=s.charAt(i);map.putIfAbsent(c,new int[n]);map.get(c)[i]++;}//统计各个队伍的选票情况}List<Character> list=new ArrayList<>(map.keySet());//把map.keySet()转为List,按value进行排序Collections.sort(list,(a,b)->{for(int i=0;i<n;i++){if(map.get(a)[i]!=map.get(b)[i]){return map.get(b)[i]-map.get(a)[i];}}return a-b;});StringBuilder res=new StringBuilder();for(char c:list){res.append(c);}return res.toString();}
}