zz: http://www.strongczq.com/2012/04/tco2012round1a-1-ellysjuice.html
题目原文:http://community.topcoder.com/stat?c=problem_statement&pm=11843
题目原文:http://community.topcoder.com/stat?c=problem_statement&pm=11843
题目大意:
一群人轮流喝两瓶饮料,分别是苹果汁和橙汁。每轮由一个人来喝,从第0轮开始算,偶数轮喝苹果汁,奇数轮喝橙汁,每轮喝掉对应饮料的一半。最终唯一一个喝的最多的人取胜,如果喝得最多的有多个人则无人取胜。给定String[] players表示每轮喝果汁的人名,但是顺序是打乱的,每个人都有可能喝多次。返回所有有可能取胜的人名,按单词升序排列。
思路:
首先需要分析取胜的条件:
- 如果某人的名字只出现了一次,那么最多只能喝半瓶饮料(如苹果汁)。这时候如果还有其他人,那么必有一人也喝了半瓶饮料(橙汁)。所以这种情况下,当参赛者只有这么一个人时才会取胜,即players中只有一个人名。
- 如果某人的名字只出现了两次,那么只要分别喝一半的苹果汁和橙汁就喝掉全部饮料的一半,必然取胜。
所以解题的依据是,如果players中只有一个人,则返回这个人,否则返回所有出现次数>=2的人(排序后)。
java代码:
public class EllysJuice
{
public String[] getWinners(String[] players)
{
Map<String, Integer> count = new HashMap<String, Integer>();
for (int i = 0; i < players. length; ++i){
if (count.containsKey(players[i])){
count.put(players[i], count.get(players[i]) + 1);
} else {
count.put(players[i], 1);
}
}
ArrayList<String> result = new ArrayList<String>();
for (Map.Entry<String, Integer> en : count.entrySet()){
if (en.getValue().intValue() >= 2){
result.add(en.getKey());
}
}
if (result.size() == 0){
if (count.size() != 1){
return new String[0];
} else {
result.add(players[0]);
}
}
String[] res = result.toArray( new String[0]);
Arrays. sort(res);
return res;
}
}